gpt4 book ai didi

c# - Task.ContinueWith 在非异步方法中的性能与使用 async/await 的对比

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

假设您有一个包装内部长时间运行方法的方法。这个外部方法可能会在调用所述长时间运行的方法之前/之后做少量工作。例如:

public async Task<int> LongRunningWrapperAsync()
{
int result = await LongRunningAsync();
result++;
return result;
}

似乎使用 async 生成的样板代码增加的重量并不一定值得使用 await,因为它的延续基本上是微不足道的。因此,给定一个足够微不足道的*延续,使用 Task.ContinueWith 是否更高效?例如

public Task<int> LongRunningWrapperAsync()
{
return LongRunningAsync().ContinueWith(task => task.Result + 1,
TaskContinuationOptions.ExecuteSynchronously);
}

* 是的,“足够”和“微不足道”都是模糊的术语。此外,我在这个人为的示例中忽略了异常处理。我想处理异常的需要意味着延续是非常重要的。

最佳答案

Therefore, given a sufficiently trivial* continuation, is it more performant to use Task.ContinueWith?

是的,但我认为这是错误的问题。

它的性能更高。但是,您必须非常小心地处理边缘情况(特别是,LongRunningAsync 引发的任何异常都会被您的代码包装在 AggregateException 中)。此外,await 会默认捕获上下文,并在该上下文中恢复方法。您可以通过 ContinueWith 以更高效的方式处理特殊情况,但您无法以更高效的方式处理一般情况。

但无论如何,性能都是一个错误的问题。我认为一个更好的问题是:代码的性能是否足够好,如果是,哪种解决方案更易于维护?

考虑代码将被执行多少次。百万?将节省多少时间?几纳秒?使用 ContinueWith 方法需要花费多少开发人员时间?每次有人查看代码时,都需要更长的时间才能看到它在做什么。通过使代码更易于维护(将节省的资金集中在您的公司中)来节省开发人员时间远比节省绝对微不足道的时间要好得多代码运行的时间(将节省的费用分摊到所有客户 - 并且分摊得如此之薄,以至于没有一个客户甚至会意识到它)。

关于c# - Task.ContinueWith 在非异步方法中的性能与使用 async/await 的对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21403023/

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