2012-05-19 41 views
1

我正在使用Threadpool在c#.NET 2.0中執行一些並行處理。線程池QueueUserWorkItem不使用SetMaxThreads,GetMaxThreads

代碼:正在從配置讀取

int MAXThreads=GetConfigValue("MaxThreadLimit"); //This value is read from app.config 

ManualResetEvent[] doneEvents=new ManualResetEvent[MAXThreads]; 
for(int i=0;i<MaxThreads,i++) 
{ 

doneEvents[i]=new ManualResetEvent(false); 

//create workload 
DoProcess job=new DoProcess(workload,doneEvents[i]); 
ThreadPool.QueueUserWorkItem(job.ThreadPoolCallBack,i); 

} 
WaitHandle.WaitAll(doneEvents); 

//proceed 

Class DoProcess 
{ 
private WorkLoad load; 
private ManualResetEvent doneEvent; 
public DoProcess(WorkLoad load,ManualResetEvent doneEvent) 
{ 
this.load=load; 
this.doneEvent=doneEvent; 
} 
public void ThreadPoolCallBack(object index) 
{ 
//Do Processing 
doneEvent.Set(); 
} 
} 

MAXThreads價值,但我想這有沒有關係產生線程的實際數量。只有少數〜4-5個線程處理所有的工作量。我想要將線程數固定在20左右。我該如何實現?我錯過了什麼?.. SetMaxThreads解決了這個問題嗎?..上述代碼將在四核CPU上運行。

+0

你可以升級到.net 4.0嗎? –

+0

這不是由我組織:( – techknowfreak

+0

QueueUserWorkItem不使用SetMaxThreads會導致線程數支持繼續加大 – zangw

回答

0

假設這是一個C#應用程序,你可以使用.NET Framework 4中的並行編程模型,並限制線程20

Parallel.For(0, n, new ParallelOptions { MaxDegreeOfParallelism = 20 }, 
    i => 
    { 
    DoWork(i); 
    }); 

但是,如果這是一個網站/應用程序,這是最好留遠離ThreadPool,除了非常小的工作,1-2線程,因爲你不想餓死ThreadPool。不要在代碼中設置最大或最小線程,因爲它會影響整個站點以及所有其他使用相同線程池的站點。

在這種情況下,我建議使用SmartThreadPool代替。

+0

我使用.NET 2.0 – techknowfreak

+0

@techknowfreak - 它是一個Web應用程序 –

+0

這是一個Windows控制檯應用程序 – techknowfreak

0

ThreadPool類中還有SetMinThreads。將最小值和最大值設置爲相同的值「應該」可以確定線程的數量,但實際發生的情況是任何人的猜測。

MSDN

線程池提供了新的工作線程或I/O完成線程 需求,直到達到最小爲每個類別。

因此,將線程的最小數量設置爲20應該給你不少於20個線程池中。

2

您必須改爲設置最小線程數。

這通常不是一個好主意,運行更多的線程比處理器核心通常得到更少由於操作系統花費時間將其交換進去,所以已經完成了工作。這些上下文切換並不便宜。線程池管理器盡最大努力將活動線程的數量限制爲內核數量。只有當現有的線程不能及時完成時才允許運行更多的線程。達到最大線程數。默認情況下是一個巨大的值,在你的情況下是1000。

只有當那些工作線程由於經常在I/O上被阻塞而不能執行足夠的工作時才增加最小線程。在這種情況下,你真的應該考慮線程對象而不是線程池線程。

+0

很好的答案,但是如果有大量的I/OI會建議使用基於APM的方法('Stream.BeginRead' /'Stream .EndRead')。在執行I/O操作時,異步I/O不會阻塞線程 – undefined