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)
主要的好处是等待异步方法将工作线程返回到池中以用于其他调用(例如,对.NET MVC Web应用程序的Web请求).异步工作在IO完成线程上完成.当等待的方法完成时,另一个工作线程将收集结果并继续执行.这可以防止工作线程池耗尽,并允许您的应用程序处理更多负载(CPU,内存和网络吞吐量取决于).
至于"等待一路下来",这对我来说似乎是一个问题.通常await与应用程序必须等待的外部资源(数据库调用,HTTP请求等)相关联.如果等待没有外部IO依赖关系的代码,则会产生不需要的开销.awaits在async方法链中可能有多个,但是等待一些自己调用await但没有其他外部IO依赖的代码并不好,只会添加回调/编译器开销.
| 归档时间: |
|
| 查看次数: |
8306 次 |
| 最近记录: |