Как я могу определить количество элементов в очереди ThreadPool - PullRequest
7 голосов
/ 10 декабря 2010

Я использую 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 ]

4 голосов
/ 10 декабря 2010

Более управляемая абстракция для очереди Производителя / Потребителя: BlockingCollection<T>. Пример кода показывает, как использовать Задачи для заполнения и истощения очереди. Число очередей легко доступно через свойство Count.

Если вы можете, избегайте использования Sleep, чтобы задержать производство большего количества предметов. Пусть производитель ожидает события или чего-либо подобного, когда очередь становится слишком большой, а потребитель (и) сигнализирует событие, когда очередь ожидания очереди достигает порогового значения, когда вам удобно, чтобы можно было производить больше элементов. Всегда старайтесь делать вещи управляемыми событиями - Sleep немного догадка.

2 голосов
/ 10 декабря 2010

Я не думаю, что есть встроенный способ, но вы можете ввести [статический?] Счетчик, который увеличит / уменьшит;для этого вам нужно создать свой собственный метод, который обернет ThreadPool.QueueUserWorkItem () и позаботится о счетчике.

Кстати, на всякий случай, если вы используете .NET 4.0, вы должны использовать TaskFactory.StartNew вместо ThreadPool.QueueUserWorkItem () - говорят, что он имеет лучшее управление памятью / потоками.

...