2014-10-31 17 views
0

我知道個以下行自定義條件的Parallel.For

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++) 
+0

此情況下,不覆蓋。只需在函數體內退出代碼。 – 2014-10-31 15:23:09

回答

2

這聽起來像你真正想要的是一個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(); 
    }); 
} 

斯蒂芬Toub有一個關於它的博客on MSDN

編輯:只是拋出了另一種選擇,你也可以使用LoopState打出來的基於我們的條件的並行循環。像這樣(僞代碼從here

的Parallel.For(0,N,(I,loopState)=> {

// ...

如果((ⅰ<! X + Y & &>我< Z))
{

loopState.Break(); 

return;  

}});

+0

請注意,這樣一個'condition'委託需要是線程安全的,並且看起來並不是這樣,因爲它基於當前迭代(不能安全訪問的數據)。如果你不知道是否會有另一個迭代,直到完成前一個迭代,那麼沒有什麼可以並行化。 – Servy 2014-10-31 15:35:33

1

Parallel.For並行代碼的目的不是要表示這樣的循環。它嚴格設計來表示從循環開始已知的多次迭代。

如果你想使用它,你需要計算調用Parallel.For之前需要的迭代次數。如果你不能合理地這樣做,那麼你將需要使用另一種並行化手段。

0

個人而言,我單獨的條件進行,從而

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) => { }); 
+1

這假設'x','y'和'z'的值在循環開始之前都是已知的,並且在循環內永遠不會改變。 – Servy 2014-10-31 15:36:32

+0

+1也是一個工作解決方案 – fubo 2014-10-31 16:02:28