ThreadPool не запускается новая тема мгновенно - PullRequest
4 голосов
/ 29 сентября 2011

У меня есть служба Windows C #, которая запускает различные объекты (библиотеки классов).Каждый из этих объектов имеет свою собственную логику «обработки», которая запускает несколько долго выполняющихся потоков обработки с помощью ThreadPool.У меня есть один пример, например, такой:

System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(WorkerThread_Processing));

Это прекрасно работает.Мое приложение работает без проблем, и мои потоки работают хорошо.

Теперь для регрессионного тестирования я запускаю те же самые объекты, но не из службы Windows, а из консольного приложения C #.Он вызывает тот же самый точный код (потому что он вызывает те же самые объекты), однако метод WorkerThread_Processing задерживается до 20 секунд перед началом.

Я вошел и переключился с ThreadPool наThread, и проблема исчезла.Что здесь может происходить?Я знаю, что я не превышаю счет MaxThreads (я начинаю не более 20 потоков).

Ответы [ 2 ]

15 голосов
/ 29 сентября 2011

ThreadPool специально , а не предназначен для долгоиграющих элементов (более конкретно, вы даже не обязательно запускаете новые потоки, когда используете ThreadPool, поскольку его целью является распространениезадачи с ограниченным числом потоков).

Если ваша задача выполняется долго, вы должны разбить ее на логические разделы, которые помещены в ThreadPool (или использовать новую структуру Task)или раскрутите свой собственный Thread объект.

Что касается почему вы испытываете задержку, в документации MSDN для ThreadPool класса говоритсяследующее:

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

Вы только знаете, что ThreadPool не достигнутоего максимум счетчик потоков, а не сколько потоков (если таковые имеются) он фактически простаивает.

2 голосов
/ 29 сентября 2011

Максимальное количество потоков в пуле потоков - это максимальное число, которое он может создать.Это не максимальное количество, которое уже создано.Пул потоков имеет логику, которая не позволяет ему мгновенно раскручивать целую кучу потоков.

Если вы вызовете ThreadPool.QueueUserWorkItem 10 раз подряд, пул потоков не создаст сразу 10 потоков.Он запустит поток, задержит, запустит другой и т. Д.

Кажется, я напомнил, что задержка составляла 500 миллисекунд, но я не могу найти документацию для проверки этого.* Вот оно: Пул управляемых потоков :

Пул потоков имеет встроенную задержку (полсекунды в .NET Framework версии 2.0) дозапуск новых свободных тем.Если ваше приложение периодически запускает множество задач в течение короткого времени, небольшое увеличение числа незанятых потоков может привести к значительному увеличению пропускной способности.Установка слишком большого количества свободных потоков потребляет системные ресурсы без необходимости.

Вы можете контролировать количество свободных потоков, поддерживаемых пулом потоков, используя GetMinThreads и SetMinThreads

.цитата взята из .NET 3.5 версии документации.Версия .NET 4.0 не упоминает задержку.

...