我读过 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 个线程。
我对这一切都错了吗?