自定义条件Parallel.For
本文关键字:For Parallel 条件 自定义 | 更新日期: 2023-09-27 18:28:42
我知道下面这行
System.Threading.Tasks.Parallel.For(0, 5, (j, u) => {});
等于
for (int j = 0; j < 5; j++){}
但是的并行代码是什么
for (int i = 0; (i < x + y && i < z); i++)
听起来你真正想要的是一个并不存在的Parallel.While构造。你可以使用类似的东西来近似功能:
public static void While(
ParallelOptions parallelOptions, Func<bool> condition,
Action<ParallelLoopState> body)
{
Parallel.ForEach(new InfinitePartitioner(), parallelOptions,
(ignored, loopState) =>
{
if (condition()) body(loopState));
else loopState.Stop();
});
}
Stephen Toub在MSDN 上有一个关于它的博客
编辑:为了抛出另一个选项,您还可以根据我们的条件使用LoopState来打破并行循环。类似这样的东西(这里的psuedo代码:
并行。对于(0,n,(i,loopState)=>{
//。。。
if(!(i<x+y&&>i<z))
{loopState.Break(); return;
}});
Parallel.For
并不是为了表示这样的循环而设计的。它被严格设计为表示从循环开始时已知的迭代次数。
如果你想使用Parallel.For
,你需要计算在调用它之前需要的迭代次数。如果你不能合理地这样做,那么你需要使用另一种并行化方法。
就我个人而言,我会将条件分离出来,因此
for (int i = x; (i < x + y && i < z); i++)
成为
int n = z < x + y ? x + y : z;
System.Threading.Tasks.Parallel.For(x, n, (i) => { });