【发布时间】:2015-07-10 23:25:38
【问题描述】:
我们得到了以下场景:
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,你可能不知道如何处理取消?
【问题讨论】:
标签: c# task cancellation-token