我有一种使用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.
}
答案 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);
}