Отмените внутреннюю задачу, используя CancellationToken в ASP.NET Core2.2 - PullRequest
2 голосов
/ 08 ноября 2019

У меня есть метод, который содержит бесконечный цикл. Я вызываю этот метод из основного метода и хочу отменить его, если это займет более 2 секунд. Я попробовал эти подходы

Task.WhenAny с отменой незавершенных задач и таймаутом

Как я могу отменить Task.WhenAll?

Как отменить задачу, используя CancellationToken, и ожидать Task.WhenAny

и множество других ссылок, но не сработало. вот мой код

static void Main(string[] args)
{
   var cts = new CancellationTokenSource(2000);   
   var task = Task.Run(() => RunTask(), cts.Token);
   await task;
}

public static void RunTask()
{
   while (true)
   {
     Console.WriteLine("in while");
   }
}

Я также пытался отменить мой токен, но он не работал. Утилизировать task невозможно. У меня нет доступа к RunTask исходному коду. Я просто могу запустить это. Я не могу отправить CancellationToken моему методу. Как я могу прекратить RunTask() метод?

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Жетоны отмены - это способ запроса отмены. Это зависит от выполняющегося кода, чтобы принять этот запрос и фактически остановить работу. Это не похоже на убийство процесса. Например, если у вас было что-то вроде:

public static void RunTask(CancellationToken cancellationToken)
{
   while (!cancellationToken.IsCancellationRequested)
   {
     Console.WriteLine("in while");
   }
}

Затем, когда он будет отменен, цикл закончится. Однако, учитывая, что текущий код не предлагает какого-либо метода отмены, и вы не можете изменить его, нет способа отменить его.

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

А как насчет этого подхода:

static void Main(string[] args)
{
   var cts = new CancellationTokenSource(2000);   
   var task = Task.Run(() => RunTask(cts.Token), cts.Token);
   await task;
}

public static void RunTask(CancellationToken token)
{
   while (!token.IsCancellationRequested)
   {
     Console.WriteLine("in while");
   }
}
...