我有一项服务需要永远运行以监控一台服务器。为此,我有 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/