C# 如何确定线程池队列中的项目数

C# 如何确定线程池队列中的项目数,c#,multithreading,threadpool,C#,Multithreading,Threadpool,我正在使用线程池对1000个工作项进行排队 While(reading in data for processing) { args = some data that has been read; ThreadPool.QueueUserWorkItem(new WaitCallback(threadRunner), args); } 不过,这工作得很好,因为主线程对请求进行排队的速度比处理请求的速度快,内存会慢慢耗尽 我想做一些类似于下面的事情,随着队列的增长来限制排队 Th

我正在使用线程池对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()-据说它具有更好的内存/线程管理。

生产者/消费者队列更易于管理的抽象是。那里的示例代码显示了如何使用任务来种子化和排出队列。队列计数可通过
count
属性随时获取


如果可以,避免使用
Sleep
延迟更多项目的生产。当队列变得太大时,让生产者等待事件或类似事件,当队列积压达到允许生产更多项目的阈值时,让消费者发出事件信号。始终尝试使事情由事件驱动-
睡眠
有点像猜测。

我接受了Andrey给出的答案,因为他回答了标题为“如何确定线程池队列中的项目数?”的问题,但您的答案对我最有用,感谢您分享此解决方案。很高兴这对我很有帮助。祝你好运