class AwaitingCancellation//通过取消延迟的同步方法的取消 处理取消
{
static void Main()
{
var source = new CancellationTokenSource();
//{System.Threading.CancellationTokenSource}
var task = DelayFor30Seconds(source.Token);
source.CancelAfter(TimeSpan.FromSeconds(1));
Console.WriteLine("Initial status: {0}", task.Status);
try
{
task.Wait();
}
catch (AggregateException e)
{
Console.WriteLine("Caught {0}", e.InnerExceptions[0]);
}
Console.WriteLine("Final status: {0}", task.Status);
}
static async Task DelayFor30Seconds(CancellationToken token)
//token IsCancellationRequested = false
{
Console.WriteLine("Waiting for 30 seconds...");
await Task.Delay(TimeSpan.FromSeconds(30), token);
}
}
处理取消
任务取消操作
启动一个异步操作,该操作调用Task.Delay模拟真正的工作,并提供了一个CancellationToken。
这一次,我们的确涉及了多个线程:到达await表达式时,控制返回调用方法,这时要求
CancellationToken在一秒后取消。然后(同步地)等待任务完成,并期望在最终得到一个
异常。最后展开任务的状态。
可认为取消操作默认是可传递的:如果A操作等待B操作,而B操作被取消了,那么我们认为
A操作也被取消了。
当然,不必那么做,可以在DelayFor30Seconds方法中捕获OperationCanceledException,
然后或继续做其他事情,或立即返回,或干脆抛出一个其他类型的异常。
输出
Waiting for 30 seconds...
Initial status: WaitingForActivation
Caught System.Threading.Tasks.TaskCanceledException: 已取消一个任务。
Final status: Canceled