您可以在线程池队列中放入多少项目是否存在一些限制?您可以在线程池中排队多少个工作项目是否有限制?
ThreadPool.QueueUserWorkItem(someCallBack);
MSDN没有给出任何指示什么限制是,如果你可能传递会发生什么(是否暂时停止其发布线程?还是它抛出一个异常?)
举个例子。如果我只在队列中排队100,000个项目会怎么样?这会工作吗?
您可以在线程池队列中放入多少项目是否存在一些限制?您可以在线程池中排队多少个工作项目是否有限制?
ThreadPool.QueueUserWorkItem(someCallBack);
MSDN没有给出任何指示什么限制是,如果你可能传递会发生什么(是否暂时停止其发布线程?还是它抛出一个异常?)
举个例子。如果我只在队列中排队100,000个项目会怎么样?这会工作吗?
没有理论上的限制排队的项目数,应该不断增加回调队列中,直到你耗尽你的资源。
但是,你为什么要补充一点,很多摆在首位?如果你有很多项目需要添加,他们可能非常短暂,你最好为你的任务找到一个更好的分区方案。
可以使用Threadpool.GetMaxThreads()和Threadpool.SetMaxThreads()来确定/修改在池中的线程的最大数量。
当你排队一个工作项目,将开始执行从池中的空闲线程如果可能的话,或者如果所有线程都很忙,它将等待,直到某个线程变得开始执行之前可用。如果排队某些内容并且没有可用的空闲线程,则不会出现错误。
我认为唯一的限制是最大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);
}
你是对的,这个例子有点夸张。我只是想知道是否在将某些事情放在队列中时需要额外的逻辑,以便在某个时候获得。所以我需要担心这个问题,并让我自己的队列进行节流,然后转发,或者最大意图和目的是线程队列'无限'队列 – Toad 2011-05-09 20:47:10
如果你想扼杀他们,你应该让自己的队列管理器限制您发布的项目数量,以及您的每个员工在完成时发出的信号。然后经理将对剩余的物品进行排队,直到他们全部处理完毕。我看到这样做的唯一优点是,在您的工作线程甚至被启动之前,您将有机会中止处理。否则,我会把他们全部排队,让他们离开。此外,有关使用GetMaxThreads和SetMaxThreads的注释与线程池中的项目数量无关 - 这不是问题所在。 – MDF 2011-05-10 16:47:47