深入理解 c# 第十五章 通过取消延迟的同步方法的取消 处理取消

本文演示了如何使用CancellationTokenSource来取消一个等待30秒的任务。通过设置延迟取消,演示了取消操作如何传递到等待的任务中,导致其提前终止并抛出TaskCanceledException。
   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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值