Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# wait Console.ReadLine()_C#_Asynchronous_Console_Async Await - Fatal编程技术网

C# wait Console.ReadLine()

C# wait Console.ReadLine(),c#,asynchronous,console,async-await,C#,Asynchronous,Console,Async Await,我目前正在构建一个异步控制台应用程序,我在其中创建了类来处理应用程序的不同区域 我已经创建了一个InputHandler类,我设想它将等待Console.ReadLine()输入。但是,您不能等待这样的函数(因为它不是异步的),我当前的解决方案是: private async Task<string> GetInputAsync() { return Task.Run(() => Console.ReadLine()) } private异步任务GetInputAsy

我目前正在构建一个异步控制台应用程序,我在其中创建了类来处理应用程序的不同区域

我已经创建了一个InputHandler类,我设想它将等待Console.ReadLine()输入。但是,您不能等待这样的函数(因为它不是异步的),我当前的解决方案是:

private async Task<string> GetInputAsync() {
    return Task.Run(() => Console.ReadLine())
}
private异步任务GetInputAsync(){
返回Task.Run(()=>Console.ReadLine())
}
它运行得非常好。然而,我(有限的)理解是调用Task.Run将触发一个新的(并行?)线程。这违背了异步方法的目的,因为新线程现在被阻塞,直到Readline()返回,对吗

我知道线程是一种昂贵的资源,所以我觉得这样做真的很浪费,很有黑客味。我还尝试了Console.In.readlinesync(),但它显然有问题?(好像挂了起来)

我知道线程是一种昂贵的资源,所以我觉得这样做真的很浪费,很有黑客味。我还尝试了Console.In.readlinesync(),但它显然有问题?(好像挂了起来)

不幸的是,控制台流确实有令人惊讶的行为。根本原因是它们阻塞以确保控制台流的线程安全。我个人认为异步方法中的阻塞是一个糟糕的设计选择,但是微软决定这样做(只针对控制台流)并且

因此,如果您确实希望以真正的异步方式读取,此API设计强制您使用后台线程(例如,
Task.Run
)。这不是您通常应该使用的模式,但在这种情况下(控制台流),围绕它们的API工作是可以接受的

然而,我(有限的)理解是调用Task.Run将触发一个新的(并行?)线程


不完全是
Task.Run
将一些工作排入线程池,线程池将由其一个线程执行代码。线程池根据需要管理线程的创建,您通常不必担心。因此,
Task.Run
并不像每次实际创建一个新线程那样浪费时间。

Hmm,不,它并没有违背异步方法的目的。这是为了不阻塞呼叫者。这当然需要一个线程,Console.ReadLine()是一个阻塞调用。线程不一定是一个昂贵的资源,只要你不走得太远,或者更确切地说,有时它们是以某种方式需要的。如果您的console应用程序在等待console.ReadLine()时正在后台处理某些内容,那么这是一个好主意。这不是
return wait Task.Run(()=>console.ReadLine())?我尝试了你写的方式,但是遇到了一个编译器错误。。。