自定义条件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.For

听起来你真正想要的是一个并不存在的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) => { });