0

我读过 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 个线程。

我对这一切都错了吗?

4

0 回答 0