Modify MaxThreads of .Net ThreadPool

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

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

None.gif
None.gif
None.gif
// Unit Testing:
None.gif

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

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

None.gif
 可以看到要修改这个限制还是有一点麻烦的。
 
另外,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、付费专栏及课程。

余额充值