Разница в производительности между синхронным обработчиком HTTP и асинхронным обработчиком HTTP - PullRequest
27 голосов
/ 18 августа 2011

Есть ли разница в производительности между синхронным обработчиком HTTP и асинхронным обработчиком HTTP? IHttpHandler против IHttpAsyncHandler

Зачем выбирать одно над другим?

Каковы преимущества?

Ответы [ 2 ]

29 голосов
/ 18 августа 2011

ASP.NET использует пул потоков для обработки входящих HTTP-запросов.

Когда вызывается IHttpHandler, поток пула потоков используется для выполнения этого запроса, и тот же поток используется для обработки всего запроса.Если этот запрос вызывает базу данных, другую веб-службу или что-либо еще, что может занять время, поток пула потоков ожидает.Это означает, что потоки пула потоков тратят время на ожидание вещей, когда они могут использоваться для обработки других запросов.

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

Для приложений с очень высоким уровнем параллелизма (сотни или тысячи действительно одновременных пользователей),IHttpAsyncHandler может значительно повысить уровень параллелизма.При меньшем количестве пользователей все равно может быть полезным, если у вас очень длинные запросы (например, запрос с длинным опросом).Тем не менее, программирование в IHttpAsyncHandler является более сложным, поэтому его не следует использовать, когда оно действительно не нужно.

3 голосов
/ 18 августа 2011

Нет никакой разницы в производительности, кроме управления другим потоком.

Синхронный код проще. Вы отправляете запрос, и поток останавливается, пока ответ не будет возвращен. Затем вы можете обработать ответ и ошибки в том же методе. Это легко читать и отлаживать. Если вы запустите этот код в потоке графического интерфейса, Windows может сообщить, что ваша программа «не отвечает», если вы не получили быстрый ответ.

Используйте Asynchronous, если вы не хотите, чтобы ваш поток зависал. Пользователь может продолжать взаимодействовать с программой, пока фоновая задача ожидает ответа HTTP. Затем вам нужно написать код для управления фоновой задачей, посмотреть, когда она будет завершена, обработать ошибки, передать эти ошибки обратно в поток графического интерфейса и т. Д. Это немного больше работы, намного сложнее для чтения и отладки, но в конечном итоге продукт лучшего качества, если все сделано правильно.

Редактировать: Исправлено, что синхронные методы замораживают поток, а не всю программу целиком.

...