Modify MaxThreads of .Net ThreadPool

本文介绍如何在.NET中通过代码方式调整ThreadPool的最大线程数限制,并讨论了ThreadPool的一些不足之处及替代方案SmartPool。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在做多线程的程序,对ThreadPool也就关心起来,看到一些人的测试数据,还有很多专家的说法──ThreadPool是使用多线程的一个简单有效的方式。但为了做效能测试,需要模拟大量的客户端连接到服务器的效果,而ThreadPool预设的限制是每部可用的处理器有 25 个执行绪,这对正常的应用来说肯定是足够的了,但在我们做效能测试的时候,却不能满足需要。帮助上说"利用 mscoree.h 档案中定义的 CorSetMaxThreads 可加以变更",但是具体怎么做却没有说(甚至有人说"可以在machine.config中修改此数字限制",显然给人造成误导)。查了很多资料,我整理出了下面的代码来修改ThreadPool 25个Thread的限制:
 
using  System.Runtime.InteropServices;
[Guid(
" CB2F6723-AB3A-11D2-9C40-00C04FA30A3E " ), ComImport]
public   class  ThreadManager
{
}


[Guid(
" 84680D3A-B2C1-46e8-ACC2-DBC0A359159A " ),
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public   interface  IThreadPool
{
    
void SetMaxThreads(uint MaxWorkerThreads, uint MaxIOCompletionThreads);
    
void GetMaxThreads(out uint MaxWorkerThreads, out uint MaxIOCompletionThreads);
    
void GetAvailableThreads(out uint AvailableWorkerThreads, out uint AvailableIOCompletionThreads);
}



// Unit Testing:

using  NUnit.Framework;
[Test]
public   void  TestSetMaxThreads()
{
    
uint maxWorkerThreads = 35;
    
uint maxIOThreads = 35;
    IThreadPool tp 
= (new ThreadManager()) as IThreadPool;
    tp.SetMaxThreads(maxWorkerThreads, maxIOThreads);
    maxWorkerThreads 
= 0;
    maxIOThreads 
= 0;
    tp.GetMaxThreads(
out maxWorkerThreads,out maxIOThreads);
    Assert.IsTrue((maxWorkerThreads
==35),"Failed");
}


[Test]
public   void  TestGetMaxThreads()
{
    
uint maxWorkerThreads = 0;
    
uint maxIOThreads = 0;
    IThreadPool tp 
= (new ThreadManager()) as IThreadPool;
    tp.GetMaxThreads(
out maxWorkerThreads,out maxIOThreads);
    Assert.IsTrue((maxWorkerThreads
==25),"Failed");
    maxWorkerThreads 
= 35;
    maxIOThreads 
= 35;
    tp.SetMaxThreads(maxWorkerThreads, maxIOThreads);
    maxWorkerThreads 
= 0;
    maxIOThreads 
= 0;
    tp.GetMaxThreads(
out maxWorkerThreads,out maxIOThreads);
    Assert.IsTrue((maxWorkerThreads
==35),"Failed");
}

 可以看到要修改这个限制还是有一点麻烦的。
 
另外,ThreadPool有一些不理想的地方:
1.只有静态方法,不能实例化。
2.排入对列的work item不能被cancel掉。
3.不适合用與需要很长时间执行一项任务的场合。
4..Net自己有很多异步方法都使用ThreadPool,一个process中的多个AppDomain都共享一个ThreadPool,所以你想让妳的ThreadPool用作单一用途是不可能的。
查找数据时发现了Smart Pool,它是一个不错的选择,大家可以研究一下。
 
关于ThreadPool 的Link:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值