所以我有一个支持"保存"方法的业务对象,该方法对某些设备执行了一些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个不必要的异步等待,我怀疑这个对象很重要.
与以往一样,对性能瓶颈的怀疑几乎毫无意义 - 重要的是有关性能瓶颈的证据.您是否尝试过现有代码并测量成本?如果没有,我强烈建议你在改变任何事情之前这样做.