在 .NET 5 中,Parallel.ForEach您可以使用ParallelLoopState.Break()方法来停止处理的额外迭代。允许当前的完成处理。
但是新的 .NET 6Parallel.ForEachAsync没有这个ParallelLoopState类,所以我们不能像使用Parallel.ForEach. 那么有没有办法在 中执行相同的中断功能ForEachAsync?CancellationToken传递给 func 我不认为这是正确的方法,因为您没有尝试取消正在运行的循环,而是阻止额外的迭代开始。
类似于此功能,但对于异步版本:
int count = 0;
Parallel.ForEach(enumerateFiles, new ParallelOptions() { CancellationToken = cancellationToken},
(file, state) =>
{
Interlocked.Increment(ref count);
if (count >= MaxFilesToProcess)
{
state.Break();
}
...
Run Code Online (Sandbox Code Playgroud)
作为一种解决方法,我可能可以.Take([xx])在将其传递到并行循环之前使用它TSource,但这可能不是打破复杂条件的选项。