ThreadPool.QueueUserWorkItem, выполнение потоков
От: Степанов Андрей  
Дата: 26.01.12 13:53
Оценка:
Добрый день!
Есть программа, которая запускает несколько потоков одновременно для выполнения длинных задач. Потоки создаются "вручную" через new Thread ( ). Меня беспокоит возможность того, что в один прекрасный момент их станет слишком много, и система загнется. Соответственно, я решил вместо ручного создания потоков использовать пул потоков, чтобы оградить себя от создания такого количества потоков, которое система не вынесет. Решение спорное, но для его проверки я написал простой код:

for ( int i = 0; i < 10000; i++ )
 System.Threading.ThreadPool.QueueUserWorkItem (
  delegate ( object a ) { Console.WriteLine ( a ); System.Threading.Thread.Sleep ( 500 ); }, i );


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

Вопросы:
1) Как работает пул потоков, что результат такой неожиданный?
2) Имеет ли смысл использовать пул потоков для того, чтобы не нарваться на переполнение системных ресурсов? Если нет, то как лучше поступить? Задача достаточно простая: есть метод, вызываемый веб-сервером. Внутри него надо параллельно запустить еще 10 методов, дождаться их завершения (но ждать не больше 10 секунд), после чего немного обработать результаты (паралеллизм тут уже не требуется) и выйти.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.