gpt4 book ai didi

c# - 返回 Task.FromResult 或仅返回异步代码中的值

转载 作者:太空宇宙 更新时间:2023-11-03 13:10:03 24 4
gpt4 key购买 nike

考虑这段代码:

class Program
{
public async Task<int> ReturnTask(bool value)
{
if (!value)
{
return 3;
}
return await ReturnTaskImp();
}

public Task<int> ReturnTask2(bool value)
{
if (!value)
{
return Task.FromResult(3);
}
return ReturnTaskImp();
}

public async Task<int> ReturnTaskImp()
{
Task.Delay(3000); //do some really heavy work
return 2; //return some value after heavy work done
}

static void Main(string[] args)
{
var p = new Program();

var t1 = p.ReturnTask(true).Result; //I know bad but not important now.
var t2 = p.ReturnTask(false).Result;
}
}

我刚看完 this

而且当您输入异步方法时,编译器似乎有一个状态机来跟踪您当前的堆栈。

现在我的问题是 ReturnTaskReturnTask2 哪个更好?因为 ReturnTask2 不需要创建新的状态机来返回一个微不足道的值。

我应该在进入异步方法之前直接返回,还是 ReturnTask 就足够了,这可能是过度优化。实际上,我已经查看了 IL 代码,看起来编译器似乎没有进行任何优化来避免使用此状态机。

最佳答案

两种实现都很好。它们的功能肯定是相同的。

是的,您通过不将方法标记为 async 来避免使用状态机。如果您正在处理极其性能敏感的代码,那可能很重要。在大多数情况下(你正在处理异步)这不太重要。毕竟,任何 async 方法都可以重写以避免状态机。您只需支付少量费用(每次方法调用创建一个类的实例)以换取(可能)使该方法更易于编写/读取。对于非常简单的异步方法,async 实际上并没有帮助使该方法更易于读/写,在这种情况下无需支付成本。当您实际利用状态机的功能并使方法更易于编写时,几乎总是值得(通常可以忽略不计的)性能成本。

因此,如果编写非异步方法对您来说同样容易,请继续使用它。如果您认为 async 方法的便利性正在为您增加值(value),请使用它。

关于c# - 返回 Task.FromResult 或仅返回异步代码中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29286947/

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