对于长时间运行的任务,使用Toub的线程池的零星内存膨胀?

时间:2014-05-27 14:47:49

标签: c# multithreading rabbitmq threadpool queueing

我已经阅读过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个线程在运行。

我是不是错了?

0 个答案:

没有答案