我已经阅读过Toub的线程池对于长时间运行的任务是一个很好的解决方案,所以我在下面的代码中实现了它。我甚至不确定我的实现是否很好,因为我似乎有零星的内存膨胀。这个过程大部分时间大约需要50 MB,然后会达到几乎GB并保持不变。
线程池实现如下(我应该这样做吗?):
private void Run()
{
while (!_stop)
{
// Create new threads if we have room in the pool
while (ManagedThreadPool.ActiveThreads < _runningMax)
{
ManagedThreadPool.QueueUserWorkItem(new WaitCallback(FindWork));
}
// Pause for a second so we don't run the CPU to death
Thread.Sleep(1000);
}
}
FindWork方法如下所示:
private void FindWork(object stateInfo)
{
bool result = false;
bool process = false;
bool queueResult = false;
Work_Work work = null;
try
{
using (Queue workQueue = new Queue(_workQueue))
{
// Look for work on the work queue
workQueue.Open(Queue.Mode.Consume);
work = workQueue.ConsumeWithBlocking<Work_Work>();
// Do some work with the message from the queue ...
return;
如果队列中没有任何内容,则ConsumeWithBlocking方法会阻止。然后,如果我们成功检索并处理它,我们会调用return来退出该线程。
通常我们运行10个线程,它们通常处于阻塞状态(WaitSleepJoin)。这一点的重点是始终有10个线程在运行。
我是不是错了?