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

Per*_*255 7 c# multithreading threadpool

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

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

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

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

Thread.Sleep(numberOfItemsCurrentlyQueued);
Run Code Online (Sandbox Code Playgroud)

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

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

Ste*_*end 5

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

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


And*_*rey 2

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

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