我知道個以下行自定義條件的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++)
我知道個以下行自定義條件的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++)
這聽起來像你真正想要的是一個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;
}});
請注意,這樣一個'condition'委託需要是線程安全的,並且看起來並不是這樣,因爲它基於當前迭代(不能安全訪問的數據)。如果你不知道是否會有另一個迭代,直到完成前一個迭代,那麼沒有什麼可以並行化。 – Servy 2014-10-31 15:35:33
Parallel.For
並行代碼的目的不是要表示這樣的循環。它嚴格設計來表示從循環開始已知的多次迭代。
如果你想使用它,你需要計算調用Parallel.For
之前需要的迭代次數。如果你不能合理地這樣做,那麼你將需要使用另一種並行化手段。
此情況下,不覆蓋。只需在函數體內退出代碼。 – 2014-10-31 15:23:09