Принудительная отмена HostingEnvironment.QueueBackgroundWorkItem для отмены через определенное время

#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 будет периодически перерабатывать ваш процесс, так что он должен (в конечном итоге) восстановиться.