如何确定线程池队列中的项目数量?

8
我正在使用线程池来排队处理数千个工作项。
While(reading in data for processing)
{
    args = some data that has been read;
    ThreadPool.QueueUserWorkItem(new WaitCallback(threadRunner), args);
}

这个功能非常好用,但是由于主线程将请求排队的速度比处理速度更快,内存会逐渐被消耗。

当队列增长时,我希望能够执行以下类似操作来限制队列的排队:

Thread.Sleep(numberOfItemsCurrentlyQueued);

随着队列的增长,等待时间会变得更长。

有没有办法发现队列中有多少项?

2个回答

5
一个更易于管理的生产者/消费者队列的抽象是BlockingCollection<T>。那里的示例代码展示了如何使用任务来填充和排出队列。队列计数可以通过Count属性轻松获得。
如果可以的话,避免使用Sleep延迟生产更多的项目。当队列变得太大时,让生产者等待事件或类似事件,并在队列积压达到您允许生产更多项目的阈值时由消费者发出信号。始终尝试使事情驱动事件-Sleep有点猜测。

我已经接受了Andrey给出的答案,因为他回答了问题标题“如何确定ThreadPool队列中的项目数量?”然而,你的答案对我来说最有用,感谢你分享这个解决方案。 - Perrin255

2
我不认为有内置的方法可以实现,但是您可以引入一个[静态?]计数器来增加/减少;为此,您需要创建自己的方法来包装ThreadPool.QueueUserWorkItem()并处理计数器。
顺便说一句,如果您正在运行.NET 4.0,您应该使用TaskFactory.StartNew而不是ThreadPool.QueueUserWorkItem()——据说它具有更好的内存/线程管理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接