C # - Как отменить задачу после ожидания ожидания? - PullRequest
0 голосов
/ 28 июня 2019

Я работаю над частным кодом и пытаюсь отменить задачу, если она не была успешно выполнена через 60 секунд.По сути, у меня есть два объекта, скажем, Object1 и Object2, которые создаются, и их методы .Run () вызываются двумя отдельными задачами.Я хочу, чтобы объект 2 отменялся, если он не завершается через 60 секунд, пока объект1 продолжает работать .. Я пытался использовать .Dispose (), но понял, что он освобождает ресурсы и фактически не отменяет задачу.

Object1 o1 = new Object1();
var o2 = new Object2();

var o2Task = Task.Factory.StartNew(() => o2.Run());
Task.Factory.StartNew((() => o1.Run()));

if(o2Task.Wait(60000))   // Should return True if completed within time
{
    Console.WriteLine("Task successfully complete");
}
else
{
    o2Task.Dispose();   // This is how I thought you would cancel it
}

1 Ответ

0 голосов
/ 29 июня 2019

Используйте взамен Task.Run (). Метод Run () имеет несколько перегрузок. В зависимости от того, что возвращает ваш o2.Run (), вот некоторые из них:

  • Run(Action, CancellationToken)
  • Run(Func<Task>, CancellationToken)
  • Run<TResult>(Func<TResult>, CancellationToken)

По сути, здесь вы видите CancellationToken. CancellationTokenSource имеет этот конструктор: CancellationTokenSource(TimeSpan delay), где delay равно

Временной интервал ожидания перед отменой CancellationTokenSource.

Более подробную информацию можно найти по этой ссылке

Вот полное решение:

class Program
{
   static void Main(string[] args)
   {
       using (var tokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(60))) // See(the remark section): https://docs.microsoft.com/en-us/dotnet/api/system.threading.cancellationtokensource.-ctor?view=netframework-4.8#System_Threading_CancellationTokenSource__ctor_System_TimeSpan_
       {
           try
           {
               new Object2().Run(tokenSource.Token).GetAwaiter().GetResult(); // <- should throw OperationCanceledException 
           }
           catch (Exception)
           {
               throw;
           }
       }
   }
}  


class Object2
{
  public Task Run(CancellationToken token)
  {
      return Task.Run(() =>
      {
          // Do your logic in o2.Run()
          // Assume o2.Run() takes 70 seconds to finish
          Thread.Sleep(70000);
          token.ThrowIfCancellationRequested();
      }, token);
  }

  public Task<T> Run<T>(CancellationToken token)
  {
      return Task.Run(() =>
      {
          // Do your logic in o2.Run()
          // Assume o2.Run() takes 70 seconds to finish
          Thread.Sleep(70000);
          token.ThrowIfCancellationRequested();
          // you can return something else instead of default(T);
          return default(T);
      }, token);
  }
}



class Object1 {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...