使用Async对List .ForEach()的任何指向?

我碰到了这段代码:

items.ForEach(async item => { doSomeStuff(); await mongoItems.FindOneAndUpdateAsync(mongoMumboJumbo); await AddBlah(SqlMumboJumbo); }); 

使这个.forEach委托有任何意义,或者它只是一个正常的foreach循环吗? 只要包含循环的函数是异步的,默认情况下这将是异步的吗?

ForEach收到的代表是Action

 public void ForEach(Action action) 

这意味着,您在其中使用的任何异步委托将有效地变为async void方法。 这些是“火与忘”的执行方式。 这意味着你的foreach不会在继续调用列表中下一个项目的委托之前异步等待,这可能是一个不受欢迎的行为。

请使用常规foreach

旁注 – Eric Lippert的foreach VS ForEach ,很棒的博文。

您不知道函数何时完成,也不知道函数的结果。 如果您在单独的任务中开始每个计算,您可以等待Task.WhenAll并解释结果,甚至捕获exception:

 private async Task ActionAsync(T item) { doSomeStuff(); await mongoItems.FindOneAndUpdateAsync(mongoMumboJumbo); await AddBlah(SqlMumboJumbo); } private async Task MyFunction(IEnumerable items) { try { foreach (var item in items) { tasks.Add( ActionAsync(item) ) } // while all actions are running do something useful // when needed await for all tasks to finish: await Task.WhenAll(tasks); // interpret the result of each action using property Task.Result } catch (AggregateException exc) { ProcessAggregateException(exc); } } 

当任何任务抛出exception时,抛出aggregateException。 如果包含所有任务抛出的所有exception。