如何确定ThreadPool队列中的项目数

时间:2010-12-10 16:23:58

标签: c# multithreading threadpool

我正在使用ThreadPool排队1000个工作项

While(reading in data for processing)
{
    args = some data that has been read;
    ThreadPool.QueueUserWorkItem(new WaitCallback(threadRunner), args);
}

然而,这非常有效,因为主线程将请求排队的速度比处理内存的速度慢得多。

我想做一些类似于以下内容的事情,以便在队列增长时限制排队

Thread.Sleep(numberOfItemsCurrentlyQueued);

随着队列的增长,这将导致更长的等待时间。

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

2 个答案:

答案 0 :(得分:4)

生产者/消费者队列的更易管理的抽象是BlockingCollection<T>。这里的示例代码显示了如何使用Tasks来播种和排空队列。队列计数可通过Count属性轻松获得。

如果可以,请避免使用Sleep来延迟生产更多商品。当队列变得太大时让生产者等待事件或类似事件,并且当队列积压达到阈值时允许消费者发出事件信号,在此阈值中您可以生成更多项目。总是试图让事情驱动 - Sleep有点猜测。

答案 1 :(得分:2)

我认为没有内置方式,但你可以引入一个会增加/减少的[静态?]计数器;为此你必须创建自己的方法来包装ThreadPool.QueueUserWorkItem()并处理计数器。

顺便说一句,如果你运行的是.NET 4.0,你应该使用TaskFactory.StartNew而不是ThreadPool.QueueUserWorkItem() - 据说它有更好的内存/线程管理。