首页 >后端开发 >C++ >如何正确处理 C# ForEach 循环中的异步操作?

如何正确处理 C# ForEach 循环中的异步操作?

Susan Sarandon
Susan Sarandon原创
2025-01-05 09:38:12377浏览

How to Properly Handle Asynchronous Operations within a C# ForEach Loop?

使用 Async 和 ForEach 查询数据

在 C# 中使用异步操作时,了解如何将它们与代码正确集成非常重要像 ForEach 这样的块。尝试在 ForEach 语句中使用 Async 关键字时会出现一个常见问题,这可能会导致编译错误。

错误:当前上下文中不存在 Async

如下面的代码片段所示,尝试在 ForEach 语句中使用 Async 可能会导致错误:

using (DataContext db = new DataLayer.DataContext())
{
    db.Groups.ToList().ForEach(i => async {
        await GetAdminsFromGroup(i.Gid);
    });
}

The发生错误是因为当前上下文中不存在名称“Async”。这是因为 ForEach 不支持异步委托。

使用 Task.WhenAll 的替代方法

要有效处理 ForEach 语句中的异步操作,可以使用 Task。 WhenAll 方法。此方法涉及将每个元素投影到异步操作中:

using (DataContext db = new DataLayer.DataContext())
{
    var tasks = db.Groups.ToList().Select(i => GetAdminsFromGroupAsync(i.Gid));
    var results = await Task.WhenAll(tasks);
}

此方法提供了多个优点:

  • 正确的错误处理: Async void 方法不能抓住了。 Task.WhenAll 允许自然的异常处理。
  • 完成感知:通过使用 Task.WhenAll,可以确定所有异步操作何时完成。
  • 自然检索结果的语法: GetAdminsFromGroupAsync 意味着产生结果的操作,可以自然返回而不是设置为 side效果。

以上是如何正确处理 C# ForEach 循环中的异步操作?的详细内容。更多信息请关注PHP中文网其他相关文章!

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