2011-11-01 99 views
-2

現在,我的功能很好。如何等候多個線程完成?

StartWorking() { 
    mThread = new Thread(fooFunction); 
    mMonitorThread = new Thread(MonitoringThreadFunction); 

    mThread.Start(); 
    mMonitorintThread.Start();  
} 

現在,我需要爲此代碼添加一個loog。讓它連續運行幾次。順序。 我試過這樣做。但它是搞砸了。主題的工作不正確。

StartWorking() 
{ 
    for(int i = 0; i < 3; i++) 
    { 
     mThread = new Thread(fooFunction); 
     mMonitorThread = new Thread(MonitoringThreadFunction); 

     mThread.Start(); 
     mMonitorintThread.Start(); 
    } 
} 

那麼,我應該爲我的purporse做些什麼呢?

+5

那麼你的問題是什麼? – sll

+0

爲什麼你想讓你的線程分三次運行?如果你有一個你想異步運行的任務,並且它有3個階段,它們在返回之前在同一個子線程中運行。如果你有3個不同的任務要運行,爲什麼不只是產生3個獨立的工作線程並完成它? – rie819

+0

@ rie819,因爲我運行這個重複數百次。所以... –

回答

0

嘗試

mThread.Join(); 
mMonitorThread.Join(); 

,或者,如果你在.NET≥4,使用System.Threading.CountdownEvent與InitialCount = 2,將其傳遞給Thread.Start()方法。

編輯:但是,TPL解決方案肯定是更清潔。

3

讓它連續運行幾次。順序。

如果您嘗試按順序運行代碼,則線程可能不合適。至少,您需要啓動兩個工作線程,然後等待它們完成。

可以這樣做,在你的代碼,通過添加調用Join(),即:

StartWorking() 
{ 
    for(int i = 0; i < 3; i++) 
    { 
     mThread = new Thread(fooFunction); 
     mMonitorThread = new Thread(MonitoringThreadFunction); 

     mThread.Start(); 
     mMonitorintThread.Start(); 

     // Wait for these to finish before starting another loop 
     mThread.Join(); 
     mMonitorintThread.Join(); 
    } 

} 

不過,我會建議考慮這個切換到使用TPL,來代替。語法乾淨多了,IMO:

StartWorking() 
{ 
    for(int i = 0; i < 3; i++) 
    { 
     Parallel.Invoke(
      () => fooFunction(), 
      () => MonitoringThreadFunction() 
     ); 
    } 
} 

此外,這將需要線程池的優勢,而不是發射了各自的時間,這很可能將是更有效的一個新的線程。 (這也將有可能重新使用當前線程,而不是讓它坐攔截...)

+0

我不理解var fooTask =(Task.Factory.StartNew(()=> fooFunction()); var monitorTask = Task.Factory.StartNew(()=> MonitoringThreadFunction()); Task.WaitAll(fooTask,monitorTask); 你能解釋一下嗎?謝謝! –

+0

Join()解決方案似乎不適用於此處。想知道爲什麼 –

+1

@AndersLind不知道爲什麼Join不起作用 - 但任務選項(以及我的改進的Parallel.Invoke版本)使用任務並行庫。有關任務的詳細信息,請參閱:http://reedcopsey.com/2010/03/15/parallelism-in-net-part-13-introducing-the-task-class/對於Parallel.Invoke,請參閱:http:// reedcopsey.com/2010/02/26/parallelism-in-net-part-11-divide-and-conquer-via-parallel-invoke/ –