8

我已經習慣了在.Net的並行擴展中使用Parallel.For(),因爲它是一種並行代碼的簡單方法,無需手動啓動和維護線程(可以很費力)。我現在正在尋找一個無限循環(做一些事情,直到我指示它停止),我希望並行化,沒有一個可用的參數Parallel.For()重載來做到這一點,所以想知道這裏最好的方法是什麼是。原則上我可以這樣做:(?)實現並行無限循環的最佳方式是什麼?

Parallel.For(0, int.Max) 

但我懷疑可能不是工作劃分邏輯來處理

另一種選擇的預期/高效的模式是這樣的:

for(;;) 
{ 
    Parallel.For(0, 128, delegate() 
    { 
     // Do stuff. 
    } 
} 

但是,這似乎不雅,也可能導致低效的工作分區。

現在我的直覺是通過創建和維護我自己的線程來手動完成此操作,但是我希望獲得關於此的一些反饋/意見。謝謝。

=== UPDATE ===

我使用的是從接受的答案的文章的代碼的簡化版本(我已經刪除了ParallelOptions參數)。下面的代碼...

public class ParallelUtils 
{ 
    public static void While(Func<bool> condition, Action body) 
    { 
     Parallel.ForEach(IterateUntilFalse(condition), ignored => body()); 
    } 

    private static IEnumerable<bool> IterateUntilFalse(Func<bool> condition) 
    { 
     while (condition()) yield return true; 
    } 
} 

一個例子用法是:

Func<bool> whileCondFn =() => !_requestStopFlag; 
ParallelUtils.While(whileCondFn, delegate() 
{ 
    // Do stuff. 


}); 
+0

在那裏,你可以消耗 – MethodMan 2011-12-29 18:30:05

回答

8

Stephen Toub有一篇關於Implementing Parallel While with Parallel.ForEach的文章。

+2

Stephen Toub的帖子對於像我這樣的新手來說是相當先進的。最好的/推薦的方法的一個簡單的例子用法將不勝感激。 – 2014-02-01 14:51:05

+0

這是一條評論或答覆? – fubo 2015-09-16 07:13:02

2

如果你(真的)想要的東西無限然後你想讓它在儘可能少的內核的可能。沒有一個Parallel.For___將是一個不錯的選擇。

你(可能)需要的是一個單獨的線程或使用LongRunning選項創建的任務。

然後讓它在信號量上等待,或作爲最後的手段儘可能多地調用Sleep()。

+1

這個問題的背景下任何線程模型,這是一個數據挖掘項目。我正在使用目前無限期運行的數據分析代碼(例如,運行一夜,然後指示它在第二天早上停止運行),並將它分類到多個線程,因爲我希望它在所有內核上無限期地運行。 – redcalx 2011-12-29 18:33:28

+4

@locster - 擁有一個可以創建子線程的主「無限」線程。 – 2011-12-29 18:36:19

1

考慮到它的無窮遠結石的要求,但你需要對每一個「循環」一些FINIT的狀態,我會說,我會改變的解決方案與外部for(;;)環路上的一些事件/狀態執行 Parallel.ForEach(...)通話更改。像Monitor信號,event通知,或類似的東西...

相關問題