使用以下代码启动新的控制台应用程序 -
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不会阻塞.
daryal在这里提供了答案 http://smellegantcode.wordpress.com/2012/08/28/a-boring-discovery/
似乎ReadLineAsync实际上并没有做它应该做的事情.框架中的错误.
我的解决方案是在循环中使用ThreadPool.QueueUserWorkItem,因此每次调用ReadLineAsync都是在新线程上完成的.
小智 5
现在可以在文档中找到:
标准输入流上的读取操作同步执行。也就是说,它们会阻塞,直到指定的读取操作完成。即使对In属性返回的TextReader对象调用异步方法(例如ReadLineAsync )也是如此。
| 归档时间: |
|
| 查看次数: |
4115 次 |
| 最近记录: |