C# .NET 中的 Parallel.ForAsync?

Parallel.ForAsync in C# .NET?

提问人:xxxx 提问时间:10/22/2023 最后编辑:Theodor Zouliasxxxx 更新时间:11/12/2023 访问量:405

问:

我想在 C# 中异步并行执行 for 循环。但该类仅包含一个同步方法和一个异步 ForEachAsync 方法 (.NET 6)。这在我看来是一个疏忽。ParallelFor

方法在哪里?有什么解决方法吗?Parallel.ForAsync

C# 异步 async-await parallel.foreachasync

评论

1赞 phuzi 10/22/2023
你的目标是哪个版本的 .NET?

答:

13赞 dragon 10/22/2023 #1

我同意
没有方法看起来像是一个巨大的疏忽。 不过,我有个好消息要告诉你: 在 .NET 8C#12 中(即将于 2023 年 11 月 23 日推出),此问题将得到解决。
Parallel.ForAsyncParallel.ForAsync

4赞 Dmitry Bychenko 10/22/2023 #2

好吧,如果你不能等待/使用 .NET 8,你可以尝试在 .NET 6 支持的帮助下进行模仿。遍历一些可枚举对象(数组、列表等),同时具有:ForAsyncForEachAsyncindex

// Must be IEnumerable<T>
var data = ...;

await Parallel.ForEachAsync(data.Select((value, index) => (value, index)), 
                            async (pair, token) => {
  var value = pair.value;
  var index = pair.index;

  //TODO: relevant code here
});

如果你想让异步版本为循环,那么for (int i = 0; i < n; ++i)

int n = ...;

await Parallel.ForEachAsync(Enumerable.Range(0, n), async (i, token) => { 
  //TODO: relevant code here
});

评论

0赞 Theodor Zoulias 10/22/2023
顺便说一句,获取 和 is 元组解构的更简洁的语法:valueindex(T value, int index) = pair;
2赞 Theodor Zoulias 10/22/2023 #3

Parallel.ForAsync API 将从 .NET 8(计划于 2023 年 11 月 14 日发布)开始提供。它具有以下三个重载:

public static Task ForAsync<T>(T fromInclusive, T toExclusive,
    Func<T, CancellationToken, ValueTask> body)
    where T : notnull, IBinaryInteger<T>;

public static Task ForAsync<T>(T fromInclusive, T toExclusive,
    CancellationToken cancellationToken, Func<T, CancellationToken, ValueTask> body)
    where T : notnull, IBinaryInteger<T>;

public static Task ForAsync<T>(T fromInclusive, T toExclusive,
    ParallelOptions parallelOptions, Func<T, CancellationToken, ValueTask> body)
    where T : notnull, IBinaryInteger<T>;

它是第一个基于 .NET 7 中引入的泛型数学接口的公共 .NET API。

使用示例:

ParallelOptions options = new() { MaxDegreeOfParallelism = 2 };

await Parallel.ForAsync(0, 100, options, async (i, ct) =>
{
   // Process the i element (here the type of i is int)
});

有关此 API 的详细信息和基准测试,请参阅 Microsoft 文档。这里还有 API 提案。