在使用ForEach时是否可以使用Async?下面是我正在尝试的代码:
using (DataContext db = new DataLayer.DataContext())
{
db.Groups.ToList().ForEach(i => async {
await GetAdminsFromGroup(i.Gid);
});
}
我收到错误:
The name 'Async' does not exist in the current context
using 语句所在的方法设置为async。
最佳答案
List<T>.ForEach
与 async
的配合不是特别好(出于同样的原因,LINQ-to-objects 也不行)。
在这种情况下,我建议将每个元素投影到一个异步操作中,然后您可以(异步地)等待它们全部完成。
using (DataContext db = new DataLayer.DataContext())
{
var tasks = db.Groups.ToList().Select(i => GetAdminsFromGroupAsync(i.Gid));
var results = await Task.WhenAll(tasks);
}
这种方法比给出 async
的好处委托(delegate)给 ForEach
是:
- 错误处理更恰当。来自
async void
的异常(exception)情况不能被catch
捕获;此方法将在await Task.WhenAll
传播异常行,允许自然异常处理。 - 你知道在这个方法结束时任务已经完成,因为它做了一个
await Task.WhenAll
。 .如果你使用async void
,您无法轻易判断操作何时完成。 - 此方法具有用于检索结果的自然语法。
GetAdminsFromGroupAsync
听起来这是一个产生结果的操作(管理员),如果此类操作可以返回它们的结果而不是将值设置为副作用,则此类代码会更自然。
关于c# - 如何将 Async 与 ForEach 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18667633/