2010-11-16 22 views
2

我聽說在多線程中使用waitall有限制(線程數等待?)。任何人都能提供細節?WaitAll限制

+0

我從未聽說過這種限制.. – caesay 2010-11-16 03:41:20

回答

2

我認爲你所指的限制不是線程數;它正等待處理的數量。從MSDN pageWaitHandle.WaitAll(WaitHandle[])

在一些實施中,如果超過64 句柄傳遞,一個 NotSupportedException異常被拋出。

在個別情況下,這一問題也隨之而來,我通常圍繞它的工作有:

WaitHandle[] handles = ... 

foreach(var waitHandle in handles) 
    waitHandle.WaitOne(); 

爲了完整起見,其他限制似乎是:

如果陣列包含重複項, 調用失敗, DuplicateWaitObjectException。

具有STAThreadAttribute的 線程不支持WaitAll方法。

1

您是否想過一個winform應用程序的STA(單線程公寓)限制?

如果是這樣,我只需在每個線程完成處理後檢查'工作隊列'是否爲空,然後在主線程擁有的單個ManualResetEvent對象上調用.WaitOne()而不是使用.WaitAll ()。

像這樣:

moSolverEvent = new ManualResetEvent(false); 
    ProcessResult(new SolverWorkInProgress()); 

    //Wait here until the last background thread reports in 
    moSolverEvent.WaitOne(); 

然後工作線程,這樣做:

if (mhSolverWorkQueue.Count == 0) moSolverEvent.Set(); 

它工作尤爲突出,避免了爲WaitAll(任何問題),即使在WinForms應用程序。畢竟,你並沒有真的等待線程完成......你正在等待工作完成。 :-)

只要確保對這些對象中的每一個都做適當的鎖定,這樣你的線程就不會彼此重複。