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

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

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

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

2 ответа

Решение

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

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

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

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

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

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

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

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

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