线程池的最大线程并发数量根据处理器的不同会有默认值,比如我的P4 CPU的电脑上线程池中辅助线程的最大数目是25,
有的时候我们需要根据实际的需要更改这个数值提高并发能力。
在.NET FrameWork2.0以前我们需要声明API来达到这个目的:
[Guid("CB2F6723-AB3A-11D2-9C40-00C04FA30A3E"), ComImport]
public class ThreadManager
{
}
[Guid("84680D3A-B2C1-46e8-ACC2-DBC0A359159A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ICorThreadpool // Cannot list any base interfaces here
{
void RegisterWaitForSingleObject();
void UnregisterWait();
void QueueUserWorkItem();
void CreateTimer();
void ChangeTimer();
void DeleteTimer();
void BindIoCompletionCallback();
void CallOrQueueUserWorkItem();
void SetMaxThreads(uint MaxWorkerThreads, uint MaxIOCompletionThreads);
void GetMaxThreads(out uint MaxWorkerThreads, out uint MaxIOCompletionThreads);
void GetAvailableThreads(out uint AvailableWorkerThreads, out uint AvailableIOCompletionThreads);
}
设置线程池中辅助线程的最大数目为50,线程池中异步 I/O 线程的最大数目为2000:
ICorThreadpool ct;
uint MaxWorkerThreads;
uint MaxIOCompletionThreads;
ThreadManager threadManager;
threadManager = new ThreadManager();
ct = (ICorThreadpool)threadManager;
//get max thread count
MaxWorkerThreads = 50;
MaxIOCompletionThreads = 2000;
ct.GetMaxThreads(out MaxWorkerThreads, out MaxIOCompletionThreads);
在.NET FrameWork2.0及3.0里面就简单了:
int i = 0;
int j = 0;
System.Threading.ThreadPool.GetMaxThreads(out i,out j);//25,1000
System.Threading.ThreadPool.SetMaxThreads(50, 2000);
注意:
不能将辅助线程的数目或 I/O 完成线程的数目设置为小于计算机的处理器数目。
如果公共语言运行库是被承载的,例如被 IIS 或 SQL Server 承载,主机可能会限制或禁止更改线程池大小。
更改线程池中的最大线程数时需谨慎。虽然这类更改可能对您的代码有益,但对您使用的代码库可能会有不利的影响。
将线程池大小设置得太大可能导致性能问题。如果同时执行的线程太多,任务切换开销就成为影响性能的一个主要因素。
|