c# - 为什么一路往下用Async/await

标签 c# .net asynchronous async-await

我想澄清一下使用 Await 和 Async 的额外好处是什么。

如果我的应用程序正在调用 await Func1()(因此不会阻塞此处的 UI)。 Func1 正在调用 await Func2(),但是 Func2() 的结果对于 Func1 的完成很重要这是工作,那么为什么我需要让 Func2() 可等待。 Func1() 执行将花费同样长的时间,因为它正在等待 Func2 完成。 await 在这里所做的就是增加 StateMachine 开销。

我是不是漏掉了什么?

最佳答案

更好的口号async all the way up。因为您从异步操作开始并使其调用者异步,然后是下一个调用者等。

当您有一个固有的异步操作(通常是 I/O 但不一定)并且您不想浪费线程等待操作完成时,您应该使用 async-await。选择 async 操作而不是同步操作不会加快操作速度。这将花费相同的时间(甚至更多)。它只是使该线程能够继续执行一些其他 CPU 密集型工作,而不是浪费资源。

但是为了能够await 那个操作方法需要是一个async 并且调用者需要await 它等等等等。

因此 async 一路向上使您能够实际进行异步调用并释放任何线程。如果它不是一直async,那么某些线程被阻塞了。

所以,这个:

async Task FooAsync()
{
    await Func1();
    // do other stuff
}

async Task Func1()
{
    await Func2();
    // do other stuff
}

async Task Func2()
{
    await tcpClient.SendAsync();
    // do other stuff
}

比这更好:

void Foo()
{
    Func1();
    // do other stuff
}

void Func1()
{
    Func2().Wait();  // Synchronously blocking a thread.
    // do other stuff
}

async Task Func2()
{
    await tcpClient.SendAsync();
    // do other stuff
}

关于c# - 为什么一路往下用Async/await,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29808915/

相关文章:

c# - 在 Xamarin Forms 的某个页面中隐藏 TabBar

.net - 无需配置文件即可访问 ASMX Web 服务,在环境之间切换

c# - 使用动态条件读取文本文件

c# 像 facebook 和 linkedin 一样从 url 获取内容

c# - 在工作场所同时使用 VB.Net 和 C# 的优点/缺点是什么?

c# - .NET Ping() 给出错误超时?

c# - 更改文件名以在 MVC3 中下载

javascript - 如何从异步调用返回响应?

c# - 异步方法的事件订阅

java - 异步调用重复我的 ArrayList 条目