我目前正在构建一个异步控制台应用程序,我已经在其中创建了类来处理应用程序的不同区域。
我已经创建了一个等待Console.ReadLine()输入的InputHandler类。然而,你不能等待这样的函数(因为它不是异步的),我目前的解决方案是简单地:
private async Task<string> GetInputAsync() {
return Task.Run(() => Console.ReadLine())
}它运行得非常好。然而,我(有限的)理解是,调用Task.Run将触发一个新的(并行?)线程。这违背了异步方法的目的,因为新线程现在被阻塞,直到Readline()返回,对吗?
我知道线程是一种昂贵的资源,所以我觉得这样做非常浪费和麻烦。我也尝试过Console.In.ReadLineAsync(),但它显然有but?(它似乎挂起了)。
发布于 2014-03-26 23:19:54
我知道线程是一种昂贵的资源,所以我觉得这样做非常浪费和麻烦。我也尝试过Console.In.ReadLineAsync(),但它显然有but?(它似乎挂起了)。
不幸的是,控制台流确实有令人惊讶的行为。潜在的原因是它们被阻塞,以确保控制台流的线程安全。就我个人而言,我认为异步方法中的阻塞是一个糟糕的设计选择,但微软决定这样做(只针对控制台流)和have stuck by their decision。
因此,如果你确实想要真正的异步阅读,这种应用程序接口设计迫使你使用后台线程(例如,Task.Run)。这不是你通常应该使用的模式,但在这种情况下(控制台流),这是一个可以接受的方法来绕过他们的API。
然而,我(有限的)理解是,调用Task.Run将触发一个新的(并行?)线程。
不完全是。Task.Run将一些工作排队到线程池中,线程池中的一个线程将执行代码。线程池根据需要管理线程的创建,您通常不必担心这一点。因此,Task.Run并不像每次实际创建一个新线程那样浪费。
https://stackoverflow.com/questions/22664392
复制相似问题