Gaz*_*yer 7 c# optimization async-await
传统意义上没有返回值优化,但我想知道你何时遇到这样的情况:
private async Task Method1()
{
await Method2();
}
private async Task Method2()
{
await Method3();
}
private async Task Method3()
{
//do something async
}
Run Code Online (Sandbox Code Playgroud)
这显然可以更好地编写:
private Task Method1()
{
return Method2();
}
private Task Method2()
{
return Method3();
}
private async Task Method3()
{
//do something async
}
Run Code Online (Sandbox Code Playgroud)
我只是想知道是否有人知道,如果(MS)编译器很聪明不够而产生状态机Method1(),并Method2()在第一时间?
不,C#编译器不优化它,它不应该.这些在概念上是两个不同的东西,这是一个类似的问题.
国际海事组织,主要的区别在于如何将异常传播到调用者Method1和Method2.我在这里演示了这个行为.
在第一种情况下(没有状态机),将立即在调用者的堆栈帧上抛出异常.如果它是unhanded,应用程序可能会立即崩溃(除非async在同一堆栈帧上的调用链中有另一种方法).
在第二种情况下(使用状态机),异常将在返回给调用者的对象中保持休眠状态Task,直到通过await task或task.Wait()稍后观察它为止.它可能会在完全不同的堆栈帧上观察到,或者根本无法观察到.我在这里发布了一些关于此的更多细节.