Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Toub的零星内存膨胀';长时间运行任务的线程池?_C#_Multithreading_Rabbitmq_Threadpool_Queueing - Fatal编程技术网

C# 使用Toub的零星内存膨胀';长时间运行任务的线程池?

C# 使用Toub的零星内存膨胀';长时间运行任务的线程池?,c#,multithreading,rabbitmq,threadpool,queueing,C#,Multithreading,Rabbitmq,Threadpool,Queueing,我已经了解到Toub的线程池对于长时间运行的任务来说是一个很好的解决方案,所以我在下面的代码中实现了它。我甚至不确定我的实现是否良好,因为我似乎有零星的内存膨胀。该进程大部分时间运行在50MB左右,然后将达到近1GB并保持不变 线程池实现如下(我是否应该这样做?): private void Run() { 而(!\u停止) { //如果池中有空间,则创建新线程 while(ManagedThreadPool.ActiveThreads

我已经了解到Toub的线程池对于长时间运行的任务来说是一个很好的解决方案,所以我在下面的代码中实现了它。我甚至不确定我的实现是否良好,因为我似乎有零星的内存膨胀。该进程大部分时间运行在50MB左右,然后将达到近1GB并保持不变

线程池实现如下(我是否应该这样做?):

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;