如何在C#中处理Task.delay的cancellingToken.cancel?

时间:2019-05-08 10:31:20

标签: c# async-await task

我有一种使用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 个答案:

答案 0 :(得分:2)

  

那么我该如何取消处理该错误的任务。

您已经取消了任务;您只需要处理错误:

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

实际上,管理员正在从wcf服务获取信号,如果管理员无法从wcf获得信号,则它将等待60秒;如果管理员在前10秒获得信号的预期数量,则无需等待接下来的50秒。

您想要的声音是信号,而不是取消。您要(异步)等待信号或时间段(延迟),然后再采取一些措施。您真的不想在这里取消。

一种异步信号是TaskCompletionSource<T>。您的动作代码可以await到该TCS的Task,而信令代码可以调用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);
}