提问人:xxxx 提问时间:10/22/2023 最后编辑:Theodor Zouliasxxxx 更新时间:11/12/2023 访问量:405
C# .NET 中的 Parallel.ForAsync?
Parallel.ForAsync in C# .NET?
问:
我想在 C# 中异步并行执行 for 循环。但该类仅包含一个同步方法和一个异步 ForEachAsync
方法 (.NET 6)。这在我看来是一个疏忽。Parallel
For
方法在哪里?有什么解决方法吗?Parallel.ForAsync
答:
13赞
dragon
10/22/2023
#1
我同意,
没有方法看起来像是一个巨大的疏忽。
不过,我有个好消息要告诉你:
在 .NET 8 和 C#12 中(即将于 2023 年 11 月 23 日推出),此问题将得到解决。Parallel.ForAsync
4赞
Dmitry Bychenko
10/22/2023
#2
好吧,如果你不能等待/使用 .NET 8,你可以尝试在 .NET 6 支持的帮助下进行模仿。遍历一些可枚举对象(数组、列表等),同时具有:ForAsync
ForEachAsync
index
// 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
});
评论
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)
});
评论