c# - 如何将 Async 与 ForEach 一起使用?

标签 c# async-await

在使用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>.ForEachasync 的配合不是特别好(出于同样的原因,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是:

  1. 错误处理更恰当。来自 async void 的异常(exception)情况不能被 catch 捕获;此方法将在 await Task.WhenAll 传播异常行,允许自然异常处理。
  2. 你知道在这个方法结束时任务已经完成,因为它做了一个await Task.WhenAll。 .如果你使用 async void ,您无法轻易判断操作何时完成。
  3. 此方法具有用于检索结果的自然语法。 GetAdminsFromGroupAsync听起来这是一个产生结果的操作(管理员),如果此类操作可以返回它们的结果而不是将值设置为副作用,则此类代码会更自然。

关于c# - 如何将 Async 与 ForEach 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18667633/

相关文章:

javascript - 尝试从公共(public) api 获取 json 数据时出现错误

c# - 在异步方法中等待完成的任务

azure - 如何确定超出主机阈值的原因 : [Threads] in Azure Functions

c# - TPL 中断未处理的异常

c# - 如何在不更改数据库模型的情况下在 Entity Framework 中添加新的实体属性

c# - 在 Windows 8 桌面应用程序上使用 MediaCapture

c# - 无法使用 XDocument 查询 XML 文档并获得所需的结果

c# - 基于 Excel 工作表更改启用/禁用功能区按钮 - VSTO

c# - 64 位服务器中的 ASMX 到 COM 调用

javascript - 在react-native中运行之前,如何让应用程序等待从从firestore获取数据的模块获取所有数据?