Modify MaxThreads of .Net ThreadPool

 
最近在做多线程的程序,对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:
 
posted @ 2005-05-26 09:39  风满袖  阅读(5294)  评论(2编辑  收藏  举报