2011-04-26 62 views
5

C#中設置ThreadPool的適當方法是什麼?我想要的線程數量等於處理器內核的數量,但我不確定異步I/O線程(第二個參數)。C#線程數

我可以簡單地說一些像ThreadPool.SetMaxThreads(Environment.ProcessorCount, 0)這樣的O/S本身推導出第二個參數嗎?

+2

你爲什麼要這樣做?線程池*已經*根據它運行的機器爲你優化了它的大小 - 我認爲你可以做得更好。 – BrokenGlass 2011-04-26 22:38:44

+0

@BrokenGlass同意。但是,例如,如果我必須將最大線程數更改爲'something!= core count',那麼我應該如何處理第二個參數呢? – 2011-04-26 22:39:41

回答

6

的最大完成端口線程由異步的任務,如Socket.Begin*Socket.*Async和其它IO相關的任務使用。我會建議,如果你改變了工作線程,那麼你應該檢查什麼是完成線程的當前的最大號碼之前更改值:

int maxWorkerThreads; 
int maxCompletionThreads; 

// Get the maximum number of completion threads 
ThreadPool.GetMaxThreads(out maxWorkerThreads, out maxCompletionThreads); 

// Set the new max worker threads, but keep the old max completion threads 
ThreadPool.SetMaxThreads(someDifferentValue, maxCompletionThreads); 

我認爲,在默認情況下完成的最大線程數是1000,但這可能因機器而異。爲了安全起見,請使用從GetMaxThreads函數獲得的值。