首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >等待Console.ReadLine()

等待Console.ReadLine()
EN

Stack Overflow用户
提问于 2014-03-26 22:40:08
回答 1查看 10.9K关注 0票数 8

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

我已经创建了一个等待Console.ReadLine()输入的InputHandler类。然而,你不能等待这样的函数(因为它不是异步的),我目前的解决方案是简单地:

代码语言:javascript
运行
复制
private async Task<string> GetInputAsync() {
    return Task.Run(() => Console.ReadLine())
}

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

我知道线程是一种昂贵的资源,所以我觉得这样做非常浪费和麻烦。我也尝试过Console.In.ReadLineAsync(),但它显然有but?(它似乎挂起了)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-26 23:19:54

我知道线程是一种昂贵的资源,所以我觉得这样做非常浪费和麻烦。我也尝试过Console.In.ReadLineAsync(),但它显然有but?(它似乎挂起了)。

不幸的是,控制台流确实有令人惊讶的行为。潜在的原因是它们被阻塞,以确保控制台流的线程安全。就我个人而言,我认为异步方法中的阻塞是一个糟糕的设计选择,但微软决定这样做(只针对控制台流)和have stuck by their decision

因此,如果你确实想要真正的异步阅读,这种应用程序接口设计迫使你使用后台线程(例如,Task.Run)。这不是你通常应该使用的模式,但在这种情况下(控制台流),这是一个可以接受的方法来绕过他们的API。

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

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

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22664392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档