Как я могу определить количество элементов в очереди ThreadPool

c# multithreading threadpool

3323 просмотра

2 ответа

Я использую ThreadPool для очереди 1000 рабочих мест

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

Это работает очень хорошо, однако, поскольку основной поток ставит запросы в очередь быстрее, чем они обрабатываются, память медленно расходуется.

Я хотел бы сделать что-то похожее на следующее, чтобы ограничить очередь по мере роста очереди

Thread.Sleep(numberOfItemsCurrentlyQueued);

Это приведет к увеличению времени ожидания по мере роста очереди.

Есть ли способ узнать, сколько предметов в очереди?

Автор: Perrin255 Источник Размещён: 12.11.2019 09:32

Ответы (2)


2 плюса

Решение

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

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

Автор: Andrey Размещён: 10.12.2010 04:29

4 плюса

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

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

Автор: Steve Townsend Размещён: 10.12.2010 05:01
32x32