2011-05-09 27 views
4

您可以在线程池队列中放入多少项目是否存在一些限制?您可以在线程池中排队多少个工作项目是否有限制?

ThreadPool.QueueUserWorkItem(someCallBack); 

MSDN没有给出任何指示什么限制是,如果你可能传递会发生什么(是否暂时停止其发布线程?还是它抛出一个异常?)

举个例子。如果我只在队列中排队100,000个项目会怎么样?这会工作吗?

回答

2

没有理论上的限制排队的项目数,应该不断增加回调队列中,直到你耗尽你的资源。

但是,你为什么要补充一点,很多摆在首位?如果你有很多项目需要添加,他们可能非常短暂,你最好为你的任务找到一个更好的分区方案。

+0

你是对的,这个例子有点夸张。我只是想知道是否在将某些事情放在队列中时需要额外的逻辑,以便在某个时候获得。所以我需要担心这个问题,并让我自己的队列进行节流,然后转发,或者最大意图和目的是线程队列'无限'队列 – Toad 2011-05-09 20:47:10

+1

如果你想扼杀他们,你应该让自己的队列管理器限制您发布的项目数量,以及您的每个员工在完成时发出的信号。然后经理将对剩余的物品进行排队,直到他们全部处理完毕。我看到这样做的唯一优点是,在您的工作线程甚至被启动之前,您将有机会中止处理。否则,我会把他们全部排队,让他们离开。此外,有关使用GetMaxThreads和SetMaxThreads的注释与线程池中的项目数量无关 - 这不是问题所在。 – MDF 2011-05-10 16:47:47

2

可以使用Threadpool.GetMaxThreads()和Threadpool.SetMaxThreads()来确定/修改在池中的线​​程的最大数量。

当你排队一个工作项目,将开始执行从池中的空闲线程如果可能的话,或者如果所有线程都很忙,它将等待,直到某个线程变得开始执行之前可用。如果排队某些内容并且没有可用的空闲线程,则不会出现错误。

+0

所以你的意思是这是做queing将“等待线程“?或者只是将所有事情排队等待,同时随着线程可用,队列将逐一清空? – Toad 2011-05-09 20:27:14

+2

“高于该数字的所有请求都会保持排队,直到线程池线程可用。”据我了解,它只是把它们放在队列中并立即返回。 – 2011-05-09 20:51:10

+0

Vladislav Zorov是对的,将项目添加到队列中的线程根本不会等待,QueueUserWorkItem方法将立即返回并允许调用线程继续处理。排队的项目将保留在队列中,直到线程空闲开始执行。 – Venr 2011-05-10 16:06:02

0

我认为唯一的限制是最大UInt32.MaxValue都可以在队列中。如果你使用32位的CLR,你会提前很长一段时间,所以你永远不会达到这个限制。

我想在64位CLR理论上你就可以打的限制,但我认为你需要左右的内存来测试它850GB。在启动内存耗尽之前(在安装了8GB RAM的计算机上),我使用6-7GB的工作集合,使用了约4,000万个排队项目。

我不知道如果你达到极限会发生什么。从带有反射器的mscorlib快速浏览一下,它甚至可能不会抛出异常,而只是溢出了不可预测的结果。

如果你有一台机器大约1TB的内存,这里有一个小的测试片段来尝试,看看自己会发生什么:)

class Program 
    { 
     static void Main(string[] args) 
     { 
      for (long i = 0; ; ++i) 
      { 
       bool succeeded = ThreadPool.QueueUserWorkItem(SleepCallBack); 
       if ((i % 1000) == 0) 
       { 
        Console.WriteLine(i); 
       } 
       if (!succeeded) break; 
      } 
      Console.Read(); 
     } 

     private static void SleepCallBack(object stateInfo) 
     { 
      Thread.Sleep(System.Threading.Timeout.Infinite); 
     } 
相关问题