在C# .NET中使用Parallel.

vd2z7a6w  于 2023-11-20  发布在  .NET
关注(0)|答案(3)|浏览(214)

我想在C#中异步并行执行for循环。但Parallel类只包含一个同步For方法和一个异步ForEachAsync方法(.NET 6)。这对我来说似乎是一个疏忽。
Parallel.ForAsync方法在哪里?有什么解决方法吗?

gwo2fgha

gwo2fgha1#

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

ebdffaop

ebdffaop2#

好吧,如果你不能等待/使用.NET 8,你可以尝试在ForEachAsync的帮助下模仿ForAsyncForEachAsync是从.NET 6开始支持的。在index的情况下循环一些可重用的(数组,列表等):

  1. // Must be IEnumerable<T>
  2. var data = ...;
  3. await Parallel.ForEachAsync(data.Select((value, index) => (value, index)),
  4. async (pair, token) => {
  5. var value = pair.value;
  6. var index = pair.index;
  7. //TODO: relevant code here
  8. });

字符串
如果你想有for (int i = 0; i < n; ++i)循环的xrc版本,

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

展开查看全部
iecba09b

iecba09b3#

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

  1. public static Task ForAsync<T>(T fromInclusive, T toExclusive,
  2. Func<T, CancellationToken, ValueTask> body)
  3. where T : notnull, IBinaryInteger<T>;
  4. public static Task ForAsync<T>(T fromInclusive, T toExclusive,
  5. CancellationToken cancellationToken, Func<T, CancellationToken, ValueTask> body)
  6. where T : notnull, IBinaryInteger<T>;
  7. public static Task ForAsync<T>(T fromInclusive, T toExclusive,
  8. ParallelOptions parallelOptions, Func<T, CancellationToken, ValueTask> body)
  9. where T : notnull, IBinaryInteger<T>;

字符串
它是第一个基于.NET 7中引入的通用数学接口的公共.NET API。
使用示例:

  1. ParallelOptions options = new() { MaxDegreeOfParallelism = 2 };
  2. await Parallel.ForAsync(0, 100, options, async (i, ct) =>
  3. {
  4. // Process the i element (here the type of i is int)
  5. });


有关此API的更多信息和基准测试可以在此Microsoft文档中找到。here也是API提案。

展开查看全部

相关问题