Как обрабатывать cancellationToken.cancel для Task.delay в c #? - PullRequest
0 голосов
/ 08 мая 2019

У меня есть метод, в котором я использую Task.Delay в течение 1 минуты.Поэтому, когда я хочу попробовать отменить эту задачу, она выдает ошибку типа system.threading.tasks.taskcanceledexception a task was canceled вместо отмены этой задачи.

Так как я могу отменить эту задачу с обработкой этой ошибки.

public static System.Threading.CancellationTokenSource tokenSource = new System.Threading.CancellationTokenSource();

tokenSource.cancel();
public static async void waitForSignal(System.Threading.CancellationToken token)
{
       await Task.Delay(60000, token);  //here I am getting error while I am defining tokenSource cancel.
}

1 Ответ

2 голосов
/ 08 мая 2019

Так как я могу отменить эту задачу с обработкой этой ошибки.

Вы уже отменяете задачу;вам просто нужно обработать ошибку:

try
{
  await Task.Delay(60000, token);
}
catch (OperationCanceledException)
{
}
...

На самом деле администратор получает сигналы от службы wcf, в которой, если администратор не получит ожидаемые сигналы от wcf, он будет ждать 60 секунд, а если администратор будетполучить ожидаемое количество сигналов в первые 10 секунд, после чего не нужно ждать следующих 50 секунд.

Похоже, что вы хотите, это сигнал , а не аннулирование .Вы хотите (асинхронно) ждать либо сигнала, либо периода времени (задержки), после которого вы хотите предпринять некоторые действия.Вы действительно не хотите отмены здесь.

Один вид асинхронного сигнала - TaskCompletionSource<T>.Ваш код действия может await Task этого TCS, а код сигнализации может позвонить SetResult для отправки сигнала.Как то так:

public static TaskCompletionSource<object> signal = new TaskCompletionSource<object>();

...

signal.SetResult(null);

...

public static async Task waitForSignal(Task signalTask)
{
  await Task.WhenAny(Task.Delay(60000), signalTask);
}
...