Использование IHttpHandler и Threadpool VS с использованием IHttpAsyncHandler

IHttpAsyncHandler означает асинхронный запуск запроса.

Использование пула потоков также может выполняться асинхронно.

Итак, если я хочу реализовать функцию (например, Comet, длинный опрос), между использованием пула потоков с IHttpHandler и использованием IHttpAsyncHandler, что лучше?

РЕДАКТИРОВАТЬ: @Jon Skeet: Спасибо за терпеливый ответ. Сделаю вывод. Если я использую delegate.BeginInvoke в IHttpHandler, «Главный поток» запроса обработки по-прежнему будет вращаться до конца запроса, независимо от того, что случилось с потоком в пуле. Если я использую IHttpAsyncHandler, «Основной поток» запроса обработки вызовет BeginProcessRequest, и после этого он будет выпущен (для обработки другого запроса). Метод BeginProcessRequest будет делать что-то асинхронно. Когда асинхронное действие завершится, будет вызван метод EndProcessRequest. (Или мы можем сказать, что «Основной поток» вызовет функцию EndProcessRequest для завершения текущего запроса)

Все вышеперечисленное - это то, что я думаю, верно?


person roast_soul    schedule 23.12.2012    source источник
comment
Что именно вы имеете в виду, говоря, что использование пула потоков также может выполняться асинхронно?   -  person Jon Skeet    schedule 23.12.2012
comment
В IHttpHandlerm я могу использовать делегат действия, его метод beginInvoke. Этот метод работает с объединенным потоком.   -  person roast_soul    schedule 23.12.2012
comment
Да, но работа в фоновом потоке - это не то же самое, что работа в асинхронном режиме. Это означает, что у вас все равно будет один поток на запрос, который вам не нужен для длительного опроса /.   -  person Jon Skeet    schedule 23.12.2012


Ответы (1)


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

Предположим, у вас есть сто тысяч клиентов, каждый из которых ведет длинный опрос - вы действительно хотите 100 000 потоков? (Подсказка: сомневаюсь, что у вас достаточно памяти ...)

При подлинной асинхронности вы можете реагировать на события, завершая запрос без наличия выделенного потока для каждого запроса. Обратите внимание, что в C # 5 и .NET 4.5 есть и более простые способы, чем использование IHttpAsyncHandler. Это зависит от того, чего вы пытаетесь достичь, но и WCF, и MVC имеют асинхронные подходы, в которых вы можете написать асинхронный метод, используя выражения await и т. Д. Если вы затем ожидаете чего-то, что само по себе не принимает поток (например, таймер или, возможно, завершение ввода-вывода), тогда вы можете управлять огромным количеством одновременных подключений.

РЕДАКТИРОВАТЬ: Чтобы ответить на ваши дальнейшие вопросы: да, если вы используете только IHttpHandler, запрос должен быть выполнен после завершения вызова ProcessRequest. Вы не можете просто оставить его «висящим» ... тогда как IHttpAsyncHandler разрешает выполнение запроса до тех пор, пока не будет вызван EndProcessRequest. Не забывайте, что это очень старый интерфейс - он не очень четко документирован, и я бы не предлагал использовать его в наши дни, когда есть значительно лучшие подходы к асинхронности, особенно с использованием .NET 4.5 и C # 5. Но основной момент в том, чтобы иметь возможность иметь запрос в процессе, но без какого-либо конкретного потока, связанного с ним, все еще сохраняется.

person Jon Skeet    schedule 23.12.2012
comment
Вы думаете, что использование IHttpAsyncHandler не застрянет при передаче соединения? - person roast_soul; 24.12.2012
comment
Я думаю, что даже при использовании IHttpAsyncHandler соединение по-прежнему поддерживается кем-то потоком. - person roast_soul; 24.12.2012
comment
@roast_soul: Почему ты так думаешь? Соединение по-прежнему будет поддерживаться, но, насколько мне известно, не будет потока, просто сидящего без дела. Это сделало бы его бессмысленным и не совсем асинхронным. - person Jon Skeet; 24.12.2012
comment
:Спасибо за ваш ответ. - person roast_soul; 25.12.2012