Как предположил Питер Бонс, токен отмены, переданный в RunAsync, создается и управляется Service Fabric, чтобы сообщить службе, что она закрыта.Вы должны следить за этой отменой, чтобы постепенно отключить ваши службы, когда сервисная структура хочет обновить или переместить службу между узлами.
Другой момент: вы не отменяете CancellationToken, вы отменяете CancellationTokenSource
, поэтому в этом случае любой поток, созданный вашим кодом, должен создать свой собственный CancellationTokenSource
для каждого потока, который будет отменен индивидуально, и токен, сгенерированный этим CancellationTokenSource
, должен быть предоставлен потоку, чтобы он знал, когда он былОтменено.
Еще один момент: если вы хотите сделать его гладким, вы должны создать связанный CancellationTokenSource
с использованием CancellationTokenSource.CreateLinkedTokenSource(SFTokenPassedOnRunAsync)
, чтобы, когда Service Fabric хочет завершить работу службы, созданный основной токен отмены отменял любыедочерние операции, в противном случае вы должны обработать это из своего кода.
Что касается основного вопроса, вы можете отменить операцию только в том же процессе, который создал CancellationTokenSource
. Более простой способ - представить конечную точку вУслуга (через удаленное взаимодействие или через Rest API), которая будет принимать вызов, find токен и отменить операцию.
Будет что-то вроде:
- Служба создаст
CancellationTokenSource
и запустит новый поток с сгенерированным токеном CancellationTokenSource
будет храниться в статической переменной, видимой в том же процессе, так что API сможет ее увидеть - Вызов Api получит это
CancellationTokenSource
и вызовет Cancel()
Если это список запущенных операций (несколько потоков), вы можете сохранить CTS в Словаре и присвоить идентификаторы каждой операции, затем вы можете найти CTS на основе идентификатора операции.