Информация об изменениях

Сообщение Почему не отменяется задача? от 15.03.2021 18:15

Изменено 15.03.2021 20:36 Passerby

Почему не отменяется задача?
Если с сервера долго не приходят данные нужно подать сигнал.
Имитировал сервер циклом, если данные приходят (новый цикл), то должен отменяться оператор
Console.WriteLine("Обработка закончена " + DateTime.Now);

Почему отмены нет?
static async Task Main(string[] args)
    {
      CancellationTokenSource cts = new CancellationTokenSource();
      Task task = null;
      for(int i=0; ;)
      {
        if (i != 0)
        {
        cts.Cancel();
        Thread.Sleep(10);
        task.Dispose();
        }
        cts = new();
        task = SignalNoServer(cts.Token);        
      }
}
static async Task SignalNoServer(CancellationToken ct)
    {
      var v = Task.Delay(2000, ct);
      v.Wait(ct);
      if (!v.IsCanceled) Console.WriteLine("Обработка закончена " + DateTime.Now);
//или другой вариант, в котором тоже нет отмены
//if (!ct.IsCancellationRequested) Console.WriteLine("Обработка закончена " + DateTime.Now);
      v.Dispose();
    }
Почему не отменяется задача?
Если с сервера долго не приходят данные нужно подать сигнал.
Имитировал сервер циклом, если данные приходят (новый цикл), то должен отменяться оператор
Console.WriteLine("Обработка закончена " + DateTime.Now);

Почему отмены нет?
static async Task Main(string[] args)
    {
      CancellationTokenSource cts = new CancellationTokenSource();
      Task task = null;
      for(int i=0; ;)
      {
        if (i != 0)
        {
         cts.Cancel();
         Thread.Sleep(10);
         task.Dispose();
        }
        cts = new();
        task = SignalNoServer(cts.Token);        
      }
}
static async Task SignalNoServer(CancellationToken ct)
    {
      var v = Task.Delay(2000, ct);
      v.Wait(ct);
      if (!v.IsCanceled) Console.WriteLine("Обработка закончена " + DateTime.Now);
//или другой вариант, в котором тоже нет отмены
//if (!ct.IsCancellationRequested) Console.WriteLine("Обработка закончена " + DateTime.Now);
      v.Dispose();
    }