2011-04-26 64 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函数获得的值。