C# 使用Toub的零星内存膨胀';长时间运行任务的线程池?
我已经了解到Toub的线程池对于长时间运行的任务来说是一个很好的解决方案,所以我在下面的代码中实现了它。我甚至不确定我的实现是否良好,因为我似乎有零星的内存膨胀。该进程大部分时间运行在50MB左右,然后将达到近1GB并保持不变 线程池实现如下(我是否应该这样做?):C# 使用Toub的零星内存膨胀';长时间运行任务的线程池?,c#,multithreading,rabbitmq,threadpool,queueing,C#,Multithreading,Rabbitmq,Threadpool,Queueing,我已经了解到Toub的线程池对于长时间运行的任务来说是一个很好的解决方案,所以我在下面的代码中实现了它。我甚至不确定我的实现是否良好,因为我似乎有零星的内存膨胀。该进程大部分时间运行在50MB左右,然后将达到近1GB并保持不变 线程池实现如下(我是否应该这样做?): private void Run() { 而(!\u停止) { //如果池中有空间,则创建新线程 while(ManagedThreadPool.ActiveThreads
private void Run()
{
而(!\u停止)
{
//如果池中有空间,则创建新线程
while(ManagedThreadPool.ActiveThreads<\u runningMax)
{
ManagedThreadPool.QueueUserWorkItem(新的WaitCallback(FindWork));
}
//暂停一下,这样我们就不会让CPU死机了
睡眠(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;
private void FindWork(对象状态信息)
{
布尔结果=假;
布尔过程=假;
bool-queueResult=false;
Work\u Work=空;
尝试
{
使用(队列工作队列=新队列(_工作队列))
{
//在工作队列中查找工作
打开(Queue.Mode.Consume);
work=workQueue.ConsumeWithBlocking();
//对队列中的消息执行一些操作。。。
回来
如果队列中没有任何内容,ConsumeWithBlocking方法将阻塞。然后,如果成功检索并处理消息,则调用return退出线程
通常我们运行10个线程,它们通常处于阻塞状态(WaitSleepJoin)。这一点的关键是让10个线程始终运行
我这样说完全错了吗?我可能错了什么,但是为什么不使用标准线程池呢?据我所知,标准线程池通常用于快速运行的任务,并且我了解到,无论出于何种原因,Toub更适合于长时间运行的任务。使用标准线程池的实现是什么样子的?ten线程可以分配比一个线程多10倍的内存。这是一个只适用于人类的特殊数字,计算机没有10个手指和脚趾,因此没有理由认为这是一个快乐的数字。如果你不知道是什么吞噬了内存,请使用内存分析器。请记住,Toub的代码可以追溯到.NET 1.0,更喜欢TaskCreationO今天,我可以用TaskCreationOption.LongRunning来做一个例子吗?再次感谢。此外,我不知道如何用任务来做这件事,因为使用取消令牌将不起作用,因为线程有时需要在处于阻塞状态(WaitSleepJoin)时停止。
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;