我们得到了以下场景:
class Program
{
static void Main(string[] args)
{
// trigger the delayed function
trigger();
// cancel the running task.
_token.Cancel();
// keep window open ;-)
Console.ReadLine();
}
private static CancellationTokenSource _token = null;
private static async void trigger()
{
_token = new CancellationTokenSource();
try
{
// run task
await Task.Run(async () =>
{
// wait time
await Task.Delay(2500);
// we should be cancelled here !!
Console.WriteLine(string.Format("IsCancellationRequested={0}", _token.Token.IsCancellationRequested));
Console.WriteLine("SHOULD NOT HAPPEN");
}, _token.Token);
}
catch (TaskCanceledException)
{
}
}
}
IMO 预期的行为是任务的操作大部分在Task.Delay(2500)被处理后被取消。
但控制台正在打印:
IsCancellationRequested=True
SHOULD NOT HAPPEN
这感觉就像一个错误。如果您将CancellationToken作为参数添加到Task.Delay -Function,它将按预期工作。
那么,如果任务中的函数使用Task.Delay,您可能不知道如何处理取消?