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

Nil*_*zor 4 c# async-await

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

    public async Task Save()
    {
        foreach (var element in Elements)
        {
            await element.Save();
        }
    }    
Run Code Online (Sandbox Code Playgroud)

现在这导致n了等待的数量,我知道每个等待都会导致一些CPU开销.我想消除这个,只有一个等待.我如何重构以实现这一目标?

Jon*_*eet 13

好吧,你可以调用Save()一切,然后等待所有人完成使用Task.WhenAll:

public async Task Save()
{
    await Task.WhenAll(Elements.Select(x => x.Save());
} 
Run Code Online (Sandbox Code Playgroud)

或者如果你真的不做任何其他事情,只需:

public Task Save()
{
    return Task.WhenAll(Elements.Select(x => x.Save());
} 
Run Code Online (Sandbox Code Playgroud)

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

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

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