ASP.NET использует пул потоков для обработки входящих HTTP-запросов.
Когда вызывается IHttpHandler, поток пула потоков используется для выполнения этого запроса, и тот же поток используется для обработки всего запроса.Если этот запрос вызывает базу данных, другую веб-службу или что-либо еще, что может занять время, поток пула потоков ожидает.Это означает, что потоки пула потоков тратят время на ожидание вещей, когда они могут использоваться для обработки других запросов.
Напротив, когда IHttpAsyncHandler, существует механизм, позволяющий запросу зарегистрировать обратный вызов и вернуть поток пула потоковв пул до полной обработки запроса.Поток пула потоков начинает выполнять некоторую обработку для запроса.Вероятно, вызывает некоторый асинхронный метод для вызова базы данных, веб-службы или чего-то еще, а затем регистрирует обратный вызов для вызова ASP.NET, когда этот вызов возвращается.В этот момент поток пула потоков, который обрабатывал HTTP-запрос, возвращается в пул для обработки другого HTTP-запроса.Когда вызов базы данных или что-то еще возвращается, ASP.NET запускает зарегистрированный обратный вызов в новом потоке пула потоков.В результате у вас нет потоков пула потоков, ожидающих выполнения операций ввода-вывода, и вы можете использовать свой пул потоков более эффективно.
Для приложений с очень высоким уровнем параллелизма (сотни или тысячи действительно одновременных пользователей),IHttpAsyncHandler может значительно повысить уровень параллелизма.При меньшем количестве пользователей все равно может быть полезным, если у вас очень длинные запросы (например, запрос с длинным опросом).Тем не менее, программирование в IHttpAsyncHandler является более сложным, поэтому его не следует использовать, когда оно действительно не нужно.