我正在使用ThreadPool排队1000个工作项
While(reading in data for processing)
{
args = some data that has been read;
ThreadPool.QueueUserWorkItem(new WaitCallback(threadRunner), args);
}
然而,这非常有效,因为主线程将请求排队的速度比处理内存的速度慢得多。
我想做一些类似于以下内容的事情,以便在队列增长时限制排队
Thread.Sleep(numberOfItemsCurrentlyQueued);
随着队列的增长,这将导致更长的等待时间。
有没有办法发现队列中有多少项?
答案 0 :(得分:4)
生产者/消费者队列的更易管理的抽象是BlockingCollection<T>
。这里的示例代码显示了如何使用Tasks来播种和排空队列。队列计数可通过Count
属性轻松获得。
如果可以,请避免使用Sleep
来延迟生产更多商品。当队列变得太大时让生产者等待事件或类似事件,并且当队列积压达到阈值时允许消费者发出事件信号,在此阈值中您可以生成更多项目。总是试图让事情驱动 - Sleep
有点猜测。
答案 1 :(得分:2)
我认为没有内置方式,但你可以引入一个会增加/减少的[静态?]计数器;为此你必须创建自己的方法来包装ThreadPool.QueueUserWorkItem()并处理计数器。
顺便说一句,如果你运行的是.NET 4.0,你应该使用TaskFactory.StartNew而不是ThreadPool.QueueUserWorkItem() - 据说它有更好的内存/线程管理。