मैं अपने कंसोल एप्लिकेशन के भीतर एक async विधि कॉल कर रहा हूँ। मैं नहीं चाहता कि ऐप शुरू होने के कुछ ही समय बाद ही बाहर निकल जाए, यानी प्रतीक्षा करने योग्य कार्यों को पूरा करने से पहले। ऐसा लगता है कि मैं यह कर सकता:कंसोल एप्लिकेशन के साथ async/await का उपयोग करते समय AsyncContext की आवश्यकता क्यों है?
internal static void Main(string[] args)
{
try
{
Task.WaitAll(DoThisAsync());
}
catch (Exception ex)
{
Console.Error.WriteLine(ex);
throw;
}
}
internal static async Task DoThisAsync()
{
//...
}
लेकिन Stephen Cleary's article के अनुसार ऐसा लगता है कि मैं ऐसा नहीं कर सकते और के लिए async जब यह (जैसे AsyncContext) किया है पर लौटने के लिए बजाय संदर्भ किसी तरह का बनाना चाहिए लगता है।
उपर्युक्त कोड हालांकि काम करता है, और यह Task.WaitAll(DoThisAsync());
के बाद मुख्य धागे पर लौटता है, तो मुझे कस्टम संदर्भ का उपयोग करने की आवश्यकता क्यों है?
शायद यह तब होता है जब आप थ्रेडपूल का उपयोग करते हैं। थ्रेडपूल धागे पृष्ठभूमि धागे हैं और केवल मुख्य धागा अग्रभूमि है। यूआई अनुप्रयोगों में एक मुख्य लूप होगा जो कुछ होने से पहले बाहर निकलने की अनुमति नहीं देता है, और कंसोल अनुप्रयोगों में आमतौर पर यह लूप नहीं होता है। इसलिए, यदि आप अपने मुख्य धागे को किसी चीज़ की प्रतीक्षा नहीं करते हैं, तो आपका एप्लिकेशन बस बाहर निकल जाएगा और थ्रेडपूल पर जो काम आप कर रहे थे, वह समाप्त हो जाएगा। मुझे यकीन नहीं है हालांकि। – Spo1ler
जैसा कि @StephenCleary द्वारा उल्लिखित है, यह सिर्फ एक वरीयता है। यह वास्तव में कोई फर्क नहीं पड़ता कि आप थ्रेड को कैसे अवरुद्ध करते हैं, आपको केवल यह पता होना चाहिए कि यदि आप किसी भी तरह से उस धागे को प्रबंधित नहीं करते हैं, तो आपका एप्लिकेशन बाहर निकल जाएगा (भले ही आपके अन्य धागे नहीं किए गए हों) – Brandon
@ ब्रैंडन वेल, यह * मामलों *। वे अलग-अलग काम करते हैं, लेकिन किसी भी दृष्टिकोण का उपयोग कर कामकाजी कार्यक्रम लिखना संभव है। – Servy