为什么Console.In.ReadLineAsync阻止?

NoP*_*God 10 c# async-await

使用以下代码启动新的控制台应用程序 -

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

            Debug.WriteLine("hi");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Console.In.ReadLineAsync是阻塞的,直到在控制台中输入一行才返回..所以"Hi"永远不会写入控制台.

在Console.In.ReadLineAsync上使用await也会阻塞.

据我所知,新的Async CTP方法不会阻塞.

这是什么原因?


这是另一个例子

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

    Debug.WriteLine("hi");
}
Run Code Online (Sandbox Code Playgroud)

这表现如我所料,它直接到下一行并打印"hi",因为Task.Delay不会阻塞.

NoP*_*God 5

daryal在这里提供了答案 http://smellegantcode.wordpress.com/2012/08/28/a-boring-discovery/

似乎ReadLineAsync实际上并没有做它应该做的事情.框架中的错误.

我的解决方案是在循环中使用ThreadPool.QueueUserWorkItem,因此每次调用ReadLineAsync都是在新线程上完成的.

  • Bug报告在这里https://connect.microsoft.com/VisualStudio/feedback/details/779079/console-readlineasync-is-actually-blocking-when-it-should-be-returning-a-task-immediately (3认同)

小智 5

现在可以在文档中找到:

标准输入流上的读取操作同步执行。也就是说,它们会阻塞,直到指定的读取操作完成。即使对In属性返回的TextReader对象调用异步方法(例如ReadLineAsync )也是如此。