Когда использовать 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 должно решить проблему, поскольку созданные потоки не являются частью пула вашего приложения.

Другие вопросы по тегам