#c# #asp.net #background-process #cancellation-token
#c# #asp.net #фоновый процесс #отмена-токен
Вопрос:
Я использую не асинхронный / ожидающий код, подобный этому
HostingEnvironment.QueueBackgroundWorkItem(x => CallApi());
Я видел примеры использования токена отмены, используемого для отмены запроса, если для завершения моего метода CallApi требуется, скажем, более 10 секунд, есть ли способ отменить весь запрос и записать некоторые выходные данные? Я не могу найти пример, в котором был установлен определенный тайм-аут
Комментарии:
1. hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx это может быть интересно
Ответ №1:
Отмена является совместной. Отмена «не подлежащей отмене» операции очень неудобна.
Если CallApi
занимает a CancellationToken
, то вы можете просто создать его, используя CancellationTokenSource
, который отменяется через определенное время.
Если CallApi
не принимает a CancellationToken
, но работает с каким HANDLE
-то объектом на основе, то вы можете попробовать отменить, закрыв базовый HANDLE
. Это распространенный (но не универсальный) способ отмены операций, которые иначе нельзя отменить.
В противном случае CallApi
это не подлежащая отмене операция, что означает, что вы смотрите на какой-то неудобный код.
Самый надежный способ отменить не подлежащую отмене операцию — поместить код в отдельный процесс и завершить этот процесс при отмене.
Однако, поскольку вы находитесь на ASP.NET уже сейчас вы могли бы также рассмотреть возможность размещения кода в отдельном домене приложения или потоке и выгрузки домена приложения / завершения потока при отмене. Со временем это приведет к нестабильности процесса, но ASP.NET будет периодически перерабатывать ваш процесс, так что он должен (в конечном итоге) восстановиться.