不是传统意义上的返回值优化,但我想知道你什么时候会遇到这样的情况:
private async Task Method1()
{
await Method2();
}
private async Task Method2()
{
await Method3();
}
private async Task Method3()
{
//do something async
}
这显然可以写得更优化:
private Task Method1()
{
return Method2();
}
private Task Method2()
{
return Method3();
}
private async Task Method3()
{
//do something async
}
我只是想知道是否有人知道(MS)编译器是否足够聪明,不会为以下内容生成状态机Method1()
and Method2()
第一个例子?
不,C# 编译器不会优化它,而且它不应该。这些在概念上是两个不同的东西,这是一个类似的问题.
IMO,主要区别在于异常如何传播到调用者中Method1
and Method2
。我演示了这种行为here.
在第一种情况下(没有状态机),会出现异常立即地抛出到调用者的堆栈帧上。如果无人操作,应用程序可能会立即崩溃(除非有另一个async
同一堆栈帧上的调用链中的方法)。
在第二种情况下(使用状态机),将保留异常dormant in the Task
对象返回给调用者,直到通过观察到它await task
or task.Wait()
, 一段时间之后。它可能会在完全不同的堆栈帧上被观察到,或者可能根本不会被观察到。我发布了一些关于此的更多详细信息here.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)