gpt4 book ai didi

c# - 需要帮助重构这个基本的异步等待循环

转载 作者:太空狗 更新时间:2023-10-30 00:08:12 25 4
gpt4 key购买 nike

所以我有一个支持“保存”方法的业务对象,该方法对某些设备执行一些 IO。然后我有一个我想批量异步保存的对象列表。我的代码现在看起来像这样:

    public async Task Save()
{
foreach (var element in Elements)
{
await element.Save();
}
}

现在这会导致 n 次等待,而且我知道每次等待都会导致一些 CPU 开销。我想消除这个,只有一个等待。我该如何重构来实现这一点?

最佳答案

好吧,您可以对所有内容调用 Save(),然后使用 Task.WhenAll 等待它们全部完成:

public async Task Save()
{
await Task.WhenAll(Elements.Select(x => x.Save());
}

或者如果您真的什么都不做,只需:

public Task Save()
{
return Task.WhenAll(Elements.Select(x => x.Save());
}

编辑:如果您想连续执行它们,请使用您已有的代码。值得注意的是,async/await 的设计方式,等待 实际上 同步完成的调用(例如缓存命中,或者在您的情况下是脏检查)非常便宜。它不需要做任何任务调度、创建延续或类似的事情。你说:

If I have a list of 10000 objects, and only 1 is dirty, I will end up with 9999 unnecessary async-awaits, which I suspect will be significant.

一如既往,关于性能瓶颈的怀疑几乎毫无意义 - 重要的是关于性能瓶颈的证据。您是否尝试过现有代码并测量成本?如果没有,我强烈建议您在更改任何内容之前执行此操作。

关于c# - 需要帮助重构这个基本的异步等待循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11397067/

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