2013-02-06 17 views
8

निम्नलिखित कोड का उपयोग कर एक नया कंसोल अनुप्रयोग शुरू -Console.In.ReadLineAsync ब्लॉक क्यों करता है?

class Program 
{ 
    static void Main(string[] args) 
    { 
     while (true) 
     { 
      Task<string> readLineTask = Console.In.ReadLineAsync(); 

      Debug.WriteLine("hi"); 
     } 
    } 
} 

Console.In.ReadLineAsync ब्लॉक कर रहा है और वापस नहीं करता है जब तक एक लाइन कंसोल में दर्ज किया गया है .. तो "हाय" कभी नहीं करने के लिए लिखा जाता है कंसोल।

Console.In.ReadLineAsync पर प्रतीक्षा का उपयोग भी ब्लॉक करता है।

यह मेरी समझ थी कि नई Async सीटीपी विधियों को अवरुद्ध नहीं करते हैं।

इसका कारण क्या है?


यहाँ एक और उदाहरण

static void Main(string[] args) 
{ 
    Task delayTask = Task.Delay(50000); 

    Debug.WriteLine("hi"); 
} 

है यह बर्ताव करता है के रूप में मैं उम्मीद है, यह सीधे अगली पंक्ति और प्रिंट "हाय" के बाद से Task.Delay ब्लॉक नहीं करता चला जाता है।

उत्तर

5

daryal यहाँ http://smellegantcode.wordpress.com/2012/08/28/a-boring-discovery/

उत्तर प्रदान किया यह ReadLineAsync वास्तव में कर नहीं किया गया है, जो उसे करना चाहिए था लगता है। ढांचे में बग।

मेरा समाधान एक लूप में ThreadPool.QueueUserWorkItem का उपयोग करना है, इसलिए ReadLineAsync को प्रत्येक कॉल को नए थ्रेड पर किया जाता है।

+3

बग यहाँ https://connect.microsoft.com/VisualStudio/feedback/details/779079/console-readlineasync-is-actually-blocking-when-it-should-be-returning-a-task रिपोर्ट किया गया है -हाथोंहाथ – NoPyGod

2

यह अब the documentation में पाया जा सकता:

पढ़ें मानक इनपुट धारा पर कार्रवाई तुल्यकालिक निष्पादित। यही है, जब तक निर्दिष्ट पठन ऑपरेशन पूरा नहीं हो जाता है तब तक वे ब्लॉक करते हैं। यह सच है भले ही ReadLineAsync जैसे एसिंक्रोनस विधि को In संपत्ति द्वारा लौटाए गए TextReader ऑब्जेक्ट पर कॉल किया गया हो।

संबंधित मुद्दे