为什么一直使用Async/await

Ala*_*ein 33 .net c# asynchronous async-await

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

如果我的应用程序正在调用await Func1()(这里没有阻止UI).并且Func1正在等待Func2(),但结果Func2()对于Func1完成它的工作很重要,那么为什么我需要Func2()等待.Func1()执行将花费同样长的时间,因为它正在等待Func2完成.await所做的就是添加StateMachine开销.

我在这里错过了什么吗?

i3a*_*non 33

一个更好的口号async一路上涨.因为你从异步操作开始并使其调用者异步,然后是下一个调用者等.

您应该async-await在具有固有异步操作(通常是I/O但不一定)时使用,并且您不想浪费线程等待操作完成.选择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
}
Run Code Online (Sandbox Code Playgroud)

比这更好:

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
}
Run Code Online (Sandbox Code Playgroud)

  • 因此,除非你一直等待,否则没有任何好处. (7认同)

Han*_*ney 9

主要的好处是等待异步方法将工作线程返回到池中以用于其他调用(例如,对.NET MVC Web应用程序的Web请求).异步工作在IO完成线程上完成.当等待的方法完成时,另一个工作线程将收集结果并继续执行.这可以防止工作线程池耗尽,并允许您的应用程序处理更多负载(CPU,内存和网络吞吐量取决于).

至于"等待一路下来",这对我来说似乎是一个问题.通常await与应用程序必须等待的外部资源(数据库调用,HTTP请求等)相关联.如果等待没有外部IO依赖关系的代码,则会产生不需要的开销.awaitsasync方法链中可能有多个,但是等待一些自己调用await但没有其他外部IO依赖的代码并不好,只会添加回调/编译器开销.