В случае, если метод контроллера обращается к стороннему ресурсу, то время его выполнения определённо зависит от множества обстоятельств: количество данных/ширина канала, время обработки запроса сторонним ресурсом, длина очереди к ресурсу и т.п.
Чем это чревато: если запросов будет довольно много, то отправив много запросов можно заблокировать все потоки в пуле, тем самым сделав недоступным сервер для обработки новых запросов.
Как вариант - заюзать на фронте nginx
А если допустимо - принимать CancellationToken и передавать его в долговыполняющиеся операции
Это может понадобиться в случае, если пользователь может сам отменить запрос или ему надоело ждать и он закрыл браузер
Пример клиентского скрипта:
Пример асинхронного метода:
cancellationToken.ThrowIfCancellationRequested(); - выбрасывает System.OperationCanceledException, если токен сигнализирует о том, что следует отменить операцию.
Также можно проверять свойство IsCancellationRequested :)
Вместо продолжительной операции я использовал Thread.Sleep(10)
В случае, если мы пишем в поток, читаем из него, из БД, или т.п., то можно передавать токен в используемые методы и ожидать их через await (см. Асинхронное программирование в C# используя async/await)
Тестовый пример можно скачать по ссылке: https://cloud.mail.ru/public/5ZNRQapm2kwa/TestAsyncControllers.zip
Чем это чревато: если запросов будет довольно много, то отправив много запросов можно заблокировать все потоки в пуле, тем самым сделав недоступным сервер для обработки новых запросов.
Как вариант - заюзать на фронте nginx
А если допустимо - принимать CancellationToken и передавать его в долговыполняющиеся операции
Это может понадобиться в случае, если пользователь может сам отменить запрос или ему надоело ждать и он закрыл браузер
Пример клиентского скрипта:
Пример асинхронного метода:
cancellationToken.ThrowIfCancellationRequested(); - выбрасывает System.OperationCanceledException, если токен сигнализирует о том, что следует отменить операцию.
Также можно проверять свойство IsCancellationRequested :)
Вместо продолжительной операции я использовал Thread.Sleep(10)
В случае, если мы пишем в поток, читаем из него, из БД, или т.п., то можно передавать токен в используемые методы и ожидать их через await (см. Асинхронное программирование в C# используя async/await)
Тестовый пример можно скачать по ссылке: https://cloud.mail.ru/public/5ZNRQapm2kwa/TestAsyncControllers.zip
Комментариев нет:
Отправить комментарий
Можете оставить свой комментарий