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

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

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

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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