所以我有一个支持“保存”方法的业务对象,它为某些设备做了一些IO。然后,我有一个列表,列出了我想要批量异步保存的对象。我的代码现在看起来像这样:
public async Task Save()
{
foreach (var element in Elements)
{
await element.Save();
}
}
现在这会产生n
次等待,我知道每次等待都会导致一些CPU开销。我想消除这个,只有一个等待。我如何重构以实现这一目标?
答案 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个不必要的异步等待,我怀疑这个对象很重要。
与以往一样,关于性能瓶颈的怀疑几乎毫无意义 - 关于性能瓶颈的证据非常重要。您是否尝试过现有代码并测量成本?如果没有,我强烈建议你在改变任何事情之前这样做。