繁体   English   中英

ThreadPool线程需要等待

[英]ThreadPool Thread needs to wait

我有一个应用程序,需要处理大量的消息(例如:每秒2000)。 业务需求要求我不要立即处理消息,而是等待2秒钟来处理每条消息。 我现在正在做的是通过Task.Factory.StartNew为每个消息从线程池中分离一个线程,并在池中的线​​程内执行“等待2秒”作业。 问题是当消息加载真的很高时,我总是得到OutOfMemory异常,尽管根据Windows操作系统的任务管理器,内存消耗实际上并不高。 但是如果我不在线程内等待,那么一切都还可以。

我的猜测是,当消息加载很高时,线程池线程不足以处理所有消息。 因此,越来越多的消息排队等待处理,当队列大小变得非常大时,会导致OOM异常。 已经尝试过ThreadPool.SetMaxThreads和ThreadPool.SetMinThreads到很高的数字,但仍然无法正常工作。 有什么建议吗?

代码如下所示:

 ThreadPool.SetMaxThreads(32768, 32768);
 ThreadPool.SetMinThreads(2500, 2500);

public void HanldeMessage(string message)
{
     Task.Factory.StartNew(() => DoWork(message))
}

public void DoWork(string message)
{
   Thread.Sleep(2000);
   // do some work to message
}

尝试这个。 你需要.NET 4.5。

private static void HandleMessage(string message)
{
    DoWork(message);
}

private static async Task DoWork(string message)
{
    await Task.Delay(2000); // instead of thread.Sleep

    // do some work...
    Console.WriteLine(message);
}

这应该有效地将线程返回池中2秒,而不是在thread.sleep上阻塞,然后返回执行。

我建议你不要阻止线程,特别是在处理可能需要数千个的场景时。 我还建议你不要设置ThreadPool.MaxThreads / MinThreads。 你在这里经历了很多滥用。

每个线程占用1MB的堆栈空间。 我打赌你看到OOM异常的原因是因为你创建了太多的线程,而不是因为排队的请求来创建线程。 你上面的情况很可怕,因为经过所有的工作来创建一个线程,它只是坐下来腐烂2秒钟。 需要做更多的工作,并且线程池最难通过创建另一个来帮助解决问题。 随着您期望的请求数量,它只是时间问题直到内存成为障碍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM