首页 >后端开发 >C++ >异步操作可以与 ForEach 一起使用吗?最好的选择是什么?

异步操作可以与 ForEach 一起使用吗?最好的选择是什么?

Patricia Arquette
Patricia Arquette原创
2025-01-05 18:41:40440浏览

Can Async Operations Be Used with ForEach, and What's the Best Alternative?

在 ForEach 中使用异步

问题:

在 ForEach 上下文中使用异步功能是否可行?下面提供了描述尝试实现的代码片段:

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 语句的方法已被指定作为

答案:

List 使用的 ForEach 的实现本质上与异步功能不兼容(类似于 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);
}

与使用 ForEach 的异步委托相比,此方法具有多个优势:

  • 增强的错误处理: 源自 async void 操作的异常不能用 catch 处理。或者,此方法将在等待 Task.WhenAll 的行传播异常,从而实现自然的异常处理功能。
  • 完成可见性: 任务的结束在结束时很容易辨别这个方法归功于Task.WhenAll的使用。相比之下,async void 操作缺乏确定完成的直接方法。
  • 自然语法: 这种方法与检索结果的自然语法一致。 GetAdminsFromGroupAsync 意味着产生结果的操作(管理员),当此类操作可以返回其结果而不是依赖副作用来设置值时,使此代码更加直观。

以上是异步操作可以与 ForEach 一起使用吗?最好的选择是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn