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 CTPメソッドがブロックされないことは私の理解であった。

この理由は何ですか?ここで


は別の例

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

    Debug.WriteLine("hi"); 
} 

ですこれは私が期待するようTask.Delayがブロックしていないので、それは次の行と版画「HI」に直進動作します。

答えて

5

daryal ReadLineAsyncが実際にそれを行うことになって何やっていないようだ、ここで http://smellegantcode.wordpress.com/2012/08/28/a-boring-discovery/

答えを提供します。フレームワークのバグ。

私の解決策は、ループ内で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オブジェクトで呼び出された場合でも該当します。

関連する問題