2011-05-12 39 views
1

我不確定這是否是一個愚蠢的問題,因爲我對線程瞭解不多,但能否同時觸發多個同步線程,並等待所有線程完成演戲之前?如果這是你怎麼做的?關閉多個同步線程

回答

1

您可以使用Parallel.Invoke
這將並行執行提供的操作,並在所有操作完成時返回。

+0

這聽起來像最簡單的方法 – jcvandan 2011-05-12 10:47:10

+0

@dormisher:它是:-) – 2011-05-12 10:47:41

+0

乾杯人 - 將執行時間從703秒減少到200毫秒! – jcvandan 2011-05-12 10:55:22

0

你不能真的做什麼東西在同一時間,更不用說發射線程:)(你可以一個接一個地快速發射它們,雖然有可能一個線程在最後一個之前開始解僱)。

至於在繼續之前等待它們,您可以使用Join方法,在繼續之前等待線程結束。

2

ut是否可以同時觸發多個同步線程,等待所有完成之後才能執行?

「同步線程」是一個矛盾,它們不存在。

當然你也可以啓動多個線程,並等待它們完成(Thread.Join(otherThread)

如果是你怎麼做呢?

很少。儘可能使用盡可能少的線程。它們是昂貴的。

確保你知道的線程池和(FX4)的任務庫,TPL

+0

謝謝,我不要太費心有關性能,這是一個難得的ocurrence和我做的唯一reaosn是因爲我必須立即多次調用Web服務 – jcvandan 2011-05-12 10:43:58

0

通常你會用像下面的結構做,

public class MultipleThreqadTest 
{ 
    private readonly Thread[] threads; 
    private readonly object locker; 
    private int finishCounter; 
    private readonly AutoResetEvent waitEvent; 

    public MultipleThreqadTest() 
    { 
     threads=new Thread[10]; 
     for(int i=0;i<0;i++) 
      threads[i]=new Thread(DoWork); 
     finishCounter = threads.Length; 
     waitEvent=new AutoResetEvent(false); 

    } 
    public void StartAll() 
    { 
     foreach (var thread in threads) 
     { 
      thread.Start(); 
     } 
     //now wait for all worker threads to complete 
     waitEvent.WaitOne(); 
    } 


    private void DoWork() 
    { 
     //Do Some Actual work here, you may need to lock this in case you are workin on some shared resource 
     //lock(locker) 
     //{ 

     //} 

     //Check if all worker thread complets 
     if(Interlocked.Decrement(ref finishCounter)==0) 
     { 
      this.waitEvent.Set(); 
     } 
    } 

}