我試圖如下簡化問題,C#線程問題
- 我身邊有100多個文件,我想讀,然後處理
- 對此我保持文件名的數組中的數據和位置
- 我生成線程來完成讀取文件的工作。
現在我的問題是我想確保一次只有5個線程產生,因爲開始100 +線程根本不是好主意。
所以請告訴我,我應該用什麼方法來確保只有5個線程在工作,並且只要他們中的一個完成了,就可以啓動新線程。
謝謝大家,
我試圖如下簡化問題,C#線程問題
現在我的問題是我想確保一次只有5個線程產生,因爲開始100 +線程根本不是好主意。
所以請告訴我,我應該用什麼方法來確保只有5個線程在工作,並且只要他們中的一個完成了,就可以啓動新線程。
謝謝大家,
我投給了task parallel library/Rx(包含在.NET 4.0,但是下載的3.5):
var options = new ParallelOptions();
options.MaxDegreeOfParallelism = 5;
Parallel.ForEach(GetListOFiles(), options, (file) =>
{
DoStuffWithFile(file);
});
注意,這將使用多達5個線程,但我已經看到它使用較少。
將文件列表分成5個相同大小的列表。然後啓動五個線程,並通過ParameterizedThreadStart
傳遞每個單獨的較小列表。
但是,由於工作幾乎完全受I/O限制,因此此過程不太可能受益於線程。
@Sam:不太確定沒有從多線程IO中獲益。有文件數據要在內存中複製,操作系統有更好的讀取知識並可以優化,磁盤可以支持並行IO(RAID?)等。當然,直到我們實際測量它時才能說出來,所以它現在說這件事還爲時過早。 – 2010-03-02 05:23:50
使用setmaxthreads不是真的推薦,除非你真的知道你在做什麼。您正在限制共享線程池,並且您使用的庫可能最終受其影響。 – 2010-03-02 05:26:35
我給了這個-1,因爲這通常是不好的做法。 – 2010-03-02 15:13:11
做你的處理通過線程池,然後setMaxThreads
http://msdn.microsoft.com/en-us/library/system.threading.threadpool.setmaxthreads.aspx
除非你真的知道你在做什麼,否則不推薦使用setmaxthreads。您正在限制_shared_線程池,並且您使用的庫可能最終受其影響。 – 2010-03-02 05:26:17
我給了這個-1,因爲這通常是不好的做法。 – 2010-03-02 15:13:40
雖然這可能不是直接回答你的問題,但似乎一個producer-consumer design將符合您的需求。另外,this可能會有所幫助。
我通常這種方法:
聲明一個共享整數變量來表示工作線程的數目。 將作業分配給線程時(只需將作業排列到ThreadPool中),增加該值。當一個線程完成作業時,減少該值。
確保整數值的遞減或遞增爲原子。
在作業調度程序中,只有在工作線程數小於最大值的情況下,才能獲取作業並分配給線程。否則,等待一個信號(這將由工作線程完成一項工作來觸發)。如果你希望事件更簡單,讓調度器簡單地做空循環等待。
好處是最大值是可配置的,它利用了內置的ThreadPool。編寫消費者/生產者模型來解決這樣一個小問題是很昂貴的。
爲什麼要求只有5個線程同時工作? – Andrew 2010-03-02 05:30:24
我想稍後再配置它。現在我想堅持5. – 2010-03-02 05:35:16
爲什麼不讓Fx決定使用多少個線程?這是ThreadPool類的默認設置,它在我的經驗中做得很好。 – 2010-03-02 07:49:04