Я не уверен на 100%, что понимаю полную картину, но я могу представить себе следующие ситуации:
У вас есть:
- Контроллер веб-API, который отображается как
ServiceReplicaListener
для обслуживания входящих запросов - Некоторые фон / продолжается работа выполнена в методе
RunAsync
первое, что нужно здесьпроверить, установлен ли CancellationToken
, переданный в RunAsync
, когда выброшен FabricObjectCloseException
.
Насколько я понимаю, FabricObjectCloseException
генерируется, когда реплика отключается ( здесь . Однажды я описал шаги, которые Service Fabric выполняет, когда служба отключается), с помощью Cluster Manager или каким-либо другимпричины.Если это предположение верно, то CancellationToken
должно быть установлено.
Если передано CancellationToken
не установлено - тогда я мог бы посоветовать вам:
- Создать простой сервис, которыйwraps
CancellationTokenSource
- Создайте экземпляр
CancellationTokenSource
внутри конструктора класса StatefulService
и инициализируйте сервис из # 1. - Используя внедрение зависимостей, внедрите этот сервис в контроллер Web API иподавление сигнала при
FabricObjectCloseException
. - В
RunAsync
проверьте состояние отмены как: пройдено CancellationToken
, так и пользовательского обслуживания.
PS Я не уверен в том, чтокакую работу вы выполняете в методе RunAsync
, но я просто хочу упомянуть, что все в порядке до return
с RunAsync
, когда фоновая часть работы выполнена, или даже не отменять ее, когда нет фонаработа.