Когда использовать System.Threading.ThreadPool и когда один из множества пользовательских пулов потоков?
Я работаю над созданием асинхронного обработчика для ASP.NET, который будет выполнять медленную хранимую процедуру. Я думаю, что понимаю, что для получения дополнительной пропускной способности при смешанной загрузке медленных и быстрых страниц медленная страница должна выполняться в пуле потоков, отдельном от того, который использует ASP.NET, в противном случае асинхронный шаблон приведет к удвоению числа скудные темы, которые будут использоваться (поправьте меня, если я ошибаюсь).
Итак, я нашел System.Threading.ThreadPool
- похоже, это должно сработать, но...
Различные учебные пособия в сети, такие как этот, который использует этот пользовательский пул, один из MiscUtils Джона Скита, и пользовательский пул потоков, упомянутый в этом учебном пособии об асинхронных шаблонах.
System.Threading.ThreadPool
существует с 1.1 - почему люди обычно чувствуют необходимость написать новый? Должен ли я избегать использования System.Threading.ThreadPool
?
Я начинающий, когда дело доходит до многопоточности, так что будьте осторожны с неопределенным жаргоном.
ОБНОВЛЕНИЕ. Хранимая процедура, которая должна быть выполнена, не обязательно будет MS-SQL и не обязательно сможет использовать встроенный асинхронный метод, такой как BeginExecuteNonQuery()
,
1 ответ
Вот что я нашел по теме. Почему вы не должны использовать ThreadPool в ASP.NET http://madskristensen.net/post/Done28099t-use-the-ThreadPool-in-ASPNET.aspx. Он довольно старый, но я не думаю, что он сильно изменился. Или поправьте меня, если я ошибаюсь.
Использование System.Threading.ThreadPool или пользовательского делегата и вызов его BeginInvoke предлагают быстрый способ запуска рабочих потоков для вашего приложения. Но, к сожалению, они снижают общую производительность вашего приложения, поскольку они используют потоки из того же пула, который используется ASP.NET для обработки HTTP-запросов.
Использование пользовательских потоков с помощью класса System.Threading.Thread должно решить проблему, поскольку созданные потоки не являются частью пула вашего приложения.