如何确定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); 

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

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

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

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

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

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