需要帮助重构这个基本的async-await循环

时间:2012-07-09 14:26:00

标签: c# async-await

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

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

现在这会产生n次等待,我知道每次等待都会导致一些CPU开销。我想消除这个,只有一个等待。我如何重构以实现这一目标?

1 个答案:

答案 0 :(得分:13)

好吧,你可以在所有内容上调用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的设计方式,等待实际同步完成的调用(例如缓存命中,或者你的情况下脏检查)非常便宜。它不需要执行任何任务调度,创建延续或类似的任何事情。你说:

  

如果我有10000个对象的列表,并且只有1个是脏的,我最终会得到9999个不必要的异步等待,我怀疑这个对象很重要。

与以往一样,关于性能瓶颈的怀疑几乎毫无意义 - 关于性能瓶颈的证据非常重要。您是否尝试过现有代码并测量成本?如果没有,我强烈建议你在改变任何事情之前这样做。