Вызвать Отмена вручную со стороны клиента в RunAsync (CancellationToken) - PullRequest
0 голосов
/ 26 октября 2018

В фоновом методе RunAsync (CancellationToken) текущий код порождает новый поток, а также содержит некоторые длительные задачи внутри цикла while (true).

Контроллер веб-API выставляется для предоставления запроса на отмену, а затемиспользуя enqueue / dequeue, этот запрос доступен в цикле RunAsync (cancellationToken) while (true).

Я просто не могу установить соединение между контроллером веб-API, получающим этот запрос на отмену, с токеном отмены, переданным впоток работает внутри метода runasync.

RunAsync(cancellationToken) 
{ 
   while(True)
   { 
     new thread(cancellationtoken)
   } 
} 

Я уверен, что нет никакой связи между запросом отмены, каким-либо образом вызванным пользователем, и cancellationToken в качестве аргумента RunAsync (), как показано в коде выше,Кажется, они не связаны.мы не хотим выходить из цикла forever в фоновом режиме RunAsync () при запросе пользователя на отмену, который предназначен только для конкретного запуска потока.
Пожалуйста, укажите мне правильное направление для запроса отмены разработки, завершающего поток.

1 Ответ

0 голосов
/ 29 октября 2018

Как предположил Питер Бонс, токен отмены, переданный в 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 на основе идентификатора операции.

...