gpt4 book ai didi

c# - 编译器是否在异步方法链上执行 "return value optimization"

转载 作者:太空狗 更新时间:2023-10-29 20:10:13 25 4
gpt4 key购买 nike

不是传统意义上的返回值优化,但我想知道你什么时候有这样的情况:

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()Method2() 生成状态机?

最佳答案

不,C# 编译器不会优化它,不应该。这些在概念上是两个不同的东西,这里是一个 similar question .

IMO,主要区别在于异常如何传播到 Method1Method2 的调用方。我演示了这个行为 here .

在第一种情况下(没有状态机),将立即在调用者的堆栈框架上抛出一个异常。如果无人值守,应用程序可能会立即崩溃(除非在同一堆栈帧上的调用链中有另一个 async 方法)。

在第二种情况下(使用状态机),异常将在返回给调用者的 Task 对象中保持休眠,直到通过 观察到它await tasktask.Wait(),稍后。它可能会在完全不同的堆栈框架上被观察到,或者可能根本不会被观察到。我发布了一些关于此的更多详细信息 here .

关于c# - 编译器是否在异步方法链上执行 "return value optimization",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22554743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com