Когда использовать System.Threading.ThreadPool и когда один из множества пользовательских пулов потоков? - PullRequest
7 голосов
/ 16 ноября 2011

Я работаю над созданием асинхронного обработчика для ASP.NET, который будет выполнять медленную хранимую процедуру. Я думаю, что понимаю, что для получения дополнительной пропускной способности при смешанной загрузке медленных и быстрых страниц медленная страница должна выполняться в пуле потоков , отдельном от того, который ASP.NET использует , в противном случае асинхронный шаблон приведет к удвоению количества дефицитных нитей (поправьте меня, если я ошибаюсь).

Итак, я нашел System.Threading.ThreadPool - похоже, это должно сработать, но ...

Различные учебные пособия в сети, такие как этот , который использует пользовательский пул , один из MiscUtils Джона Скита и пользовательский пул потоков, на которые ссылаются в этом руководстве по асинхронным шаблонам .

System.Threading.ThreadPool существует с 1.1 - почему люди обычно чувствуют необходимость написать новый? Следует ли мне избегать использования System.Threading.ThreadPool?

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

UPDATE . Хранимая процедура, которая будет выполнена, не обязательно будет MS-SQL и не обязательно сможет использовать встроенный асинхронный метод, такой как BeginExecuteNonQuery().

1 Ответ

3 голосов
/ 16 ноября 2011

Вот что я нашел по теме.Почему вы не должны использовать ThreadPool в ASP.NET http://madskristensen.net/post/Done28099t-use-the-ThreadPool-in-ASPNET.aspx. Он довольно старый, но я не думаю, что он сильно изменился.Или исправьте меня, если я ошибаюсь.

Использование System.Threading.ThreadPool или специального делегата и вызов его BeginInvoke предлагают быстрый способ запустить рабочие потоки для вашего приложения.Но, к сожалению, они снижают общую производительность вашего приложения, поскольку они потребляют потоки из того же пула, который используется ASP.NET для обработки HTTP-запросов.

Использование пользовательских потоков с помощью класса System.Threading.Thread должно решить проблему.проблема в том, что созданные потоки не являются частью пула вашего приложения.

...