c# - OutOfMemory Exception C# 使用线程时

标签 c# multithreading threadpool out-of-memory

我有一项服务需要永远运行以监控一台服务器。为此,我有 5 个任务需要由服务完成(目前有 5 个,将来会有数百个)。

我创建了一个最多有 5 个线程的线程池。线程使用一个队列来获取任务,然后每个线程处理该任务,然后再次将其入队。队列包含具有 5 个小属性的对象。

服务运行一段时间后,我在执行此操作的行收到 OutOfMemoryException:

ThreadPool.QueueUserWorkItem(currentJob.ProcessJob, (object)timeToWwait);

timeToWwait 是一个 int,我不再使用它了。

上下文是这样的:

        ThreadPool.SetMinThreads(0, 0);
        ThreadPool.SetMaxThreads(5, 5);
        while (true)
        {
            bool processJob = false;
            bool checkedFrontEnd = false;
            _qLock.EnterWriteLock();
            try
            {
                if (_jobQueue.Count > 0)
                {
                    currentJob = _jobQueue.Dequeue();
                    // currentJob.IsActive = true;
                    // processJob = true;
                }
            }
            finally
            {
                _qLock.ExitWriteLock();
            }
            ThreadPool.QueueUserWorkItem(currentJob.ProcessJob, (object)timeToWwait);
            //currentJob.ProcessJob((object)timeToWwait);


            _qLock.EnterWriteLock();
            try
            {
                _jobQueue.Enqueue(currentJob);
            }
            finally
            {
                _qLock.ExitWriteLock();
            }

请问您有什么建议吗?

最佳答案

您的问题是您在后台任务有机会完成之前将 currentJob 实例排入队列。你会想要做这样的事情:

        ThreadPool.QueueUserWorkItem((state) =>
                                         { 
                                             currentJob.ProcessJob();
                                             _qLock.EnterWriteLock();
                                             try
                                             {
                                                 _jobQueue.Enqueue(currentJob);
                                             }
                                             finally
                                             {
                                                 _qLock.ExitWriteLock();
                                             } 

                                         }
            );

关于c# - OutOfMemory Exception C# 使用线程时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8676141/

相关文章:

c# - .Net 实时软件许可

c# - C#中按下回车键时如何触发按钮点击事件

c# - C# 回调函数不是从 C++ 代码调用的

java - java 中的暂停、恢复和停止线程

java - ThreadPoolExecutor 挂起

c# - 在哪里放置转换函数?

c# - 如何在Windows Phone 8 中同步调用异步方法

ios - 让 for 循环等待队列完成后再继续

c# - 有没有办法让事件处理程序直接在 UI 线程上运行而无需中间线程池线程?

c# - 使用信号量进行线程化