Как остановить конкретную задачу в C # - PullRequest
0 голосов
/ 02 ноября 2019

Я делаю бота, у которого есть несколько задач. Теперь я хочу, чтобы пользователи могли останавливать / запускать определенные задачи. Есть ли способ, которым я могу остановить задачу через Taskid? Моя идея заключалась в том, что я мог бы захватить идентификатор задачи, и когда пользователь нажимает кнопку «Остановить задачу» с этим идентификатором задачи, останавливается / исполняется. Спасибо за помощь! :)

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

Отмена задач TPL невозможна из внешних источников.
Сказав это, можно сделать это, передав CancellationToken своему Task.
Вы можете проверить свойство этого токена IsCancellationRequested и сгенерировать исключение, тем самым убив задачу.

Теперь, чтобы активировать это свойство, необходимо создать CancellationTokenSource, передать его CancellationTokenк цели Task.

Если вы хотите, чтобы ваша задача была убита, вы должны использовать метод CancellationTokenSource Cancel, который действует как триггер и изменяет вышеупомянутое свойство.

Более подробную информацию можно найти здесь !

         public void Initialize()
         {
            CancellationTokenSource cts=new CancellationTokenSource();
            Task myTask=Task.Run(()=>Worker(cts.Token),cts.Token);
            TriggerLoop(cts);
         }

         public void TriggerLoop(CancellationTokenSource cts)
         {
            while(true)
            {
               if(Console.ReadKey().Key=='A')
               {
                cts.Cancel();
               }
            }       
         }

         public void Worker(CancellationToken token)
         {
           while(true)
            {
              //do your stuff
              if(token.IsCancellationRequested)
              {
                  token.ThrowIfCancellationRequested();
              }
           }
        }
0 голосов
/ 03 ноября 2019

Пожалуйста, смотрите CancellationToken .

while(true)
{
   if (token.IsCancellationRequested)
   {
      break;
   }
   DoAPieceOfWork();
}

Вот две статьи с примерами кода:

...