2010-03-02 103 views
5

我試圖如下簡化問題,C#線程問題

  1. 我身邊有100多個文件,我想讀,然後處理
  2. 對此我保持文件名的數組中的數據和位置
  3. 我生成線程來完成讀取文件的工作。

現在我的問題是我想確保一次只有5個線程產生,因爲開始100 +線程根本不是好主意。

所以請告訴我,我應該用什麼方法來確保只有5個線程在工作,並且只要他們中的一個完成了,就可以啓動新線程。

謝謝大家,

+0

爲什麼要求只有5個線程同時工作? – Andrew 2010-03-02 05:30:24

+0

我想稍後再配置它。現在我想堅持5. – 2010-03-02 05:35:16

+0

爲什麼不讓Fx決定使用多少個線程?這是ThreadPool類的默認設置,它在我的經驗中做得很好。 – 2010-03-02 07:49:04

回答

4

我投給了task parallel library/Rx(包含在.NET 4.0,但是下載的3.5):

 var options = new ParallelOptions(); 
     options.MaxDegreeOfParallelism = 5; 

     Parallel.ForEach(GetListOFiles(), options, (file) => 
     { 
      DoStuffWithFile(file); 
     }); 

注意,這將使用多達5個線程,但我已經看到它使用較少。

2

將文件列表分成5個相同大小的列表。然後啓動五個線程,並通過ParameterizedThreadStart傳遞每個單獨的較小列表。

但是,由於工作幾乎完全受I/O限制,因此此過程不太可能受益於線程。

+0

@Sam:不太確定沒有從多線程IO中獲益。有文件數據要在內存中複製,操作系統有更好的讀取知識並可以優化,磁盤可以支持並行IO(RAID?)等。當然,直到我們實際測量它時才能說出來,所以它現在說這件事還爲時過早。 – 2010-03-02 05:23:50

4
+1

使用setmaxthreads不是真的推薦,除非你真的知道你在做什麼。您正在限制共享線程池,並且您使用的庫可能最終受其影響。 – 2010-03-02 05:26:35

+0

我給了這個-1,因爲這通常是不好的做法。 – 2010-03-02 15:13:11

2

雖然這可能不是直接回答你的問題,但似乎一個producer-consumer design將符合您的需求。另外,this可能會有所幫助。

2

我通常這種方法:

聲明一個共享整數變量來表示工作線程的數目。 將作業分配給線程時(只需將作業排列到ThreadPool中),增加該值。當一個線程完成作業時,減少該值。

確保整數值的遞減或遞增爲原子。

在作業調度程序中,只有在工作線程數小於最大值的情況下,才能獲取作業並分配給線程。否則,等待一個信號(這將由工作線程完成一項工作來觸發)。如果你希望事件更簡單,讓調度器簡單地做空循環等待。

好處是最大值是可配置的,它利用了內置的ThreadPool。編寫消費者/生產者模型來解決這樣一個小問題是很昂貴的。