ASP.NET Web API: Отмена долгих запросов

В случае, если метод контроллера обращается к стороннему ресурсу, то время его выполнения определённо зависит от множества обстоятельств: количество данных/ширина канала, время обработки запроса сторонним ресурсом, длина очереди к ресурсу и т.п.

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

Как вариант - заюзать на фронте nginx

А если допустимо - принимать CancellationToken и передавать его в долговыполняющиеся операции

Это может понадобиться в случае, если пользователь может сам отменить запрос или ему надоело ждать и он закрыл браузер


Пример клиентского скрипта:



Пример асинхронного метода:



cancellationToken.ThrowIfCancellationRequested(); - выбрасывает System.OperationCanceledException, если токен сигнализирует о том, что следует отменить операцию.

Также можно проверять свойство IsCancellationRequested :)

Вместо продолжительной операции я использовал Thread.Sleep(10)

В случае, если мы пишем в поток, читаем из него, из БД, или т.п., то можно передавать токен в используемые методы и ожидать их через await (см. Асинхронное программирование в C# используя async/await)

Тестовый пример можно скачать по ссылке: https://cloud.mail.ru/public/5ZNRQapm2kwa/TestAsyncControllers.zip


Комментариев нет:

Отправить комментарий

Можете оставить свой комментарий