Task扩展方法取消操作

 1     /// <summary>
 2     /// 任务扩展,传入取消操作
 3     /// </summary>
 4     public static class TaskExtensionDemo
 5     {
 6         //因为没有非泛型的TaskCompleteSource类
 7         private struct Void { }
 8 
 9         public static async Task<TResult> WithCancellation<TResult>(this Task<TResult> originalTask, CancellationToken cancellationToken)
10         {
11             var cancelTask = new TaskCompletionSource<Void>();
12 
13             // 注册一个将在取消此 System.Threading.CancellationToken 时调用的委托。
14             using (cancellationToken.Register(t => ((TaskCompletionSource<Void>)t).TrySetResult(new Void()), cancelTask))
15             {
16                 Task any = await Task.WhenAny(originalTask, cancelTask.Task);
17 
18                 if (any == cancelTask.Task)
19                 {
20                     cancellationToken.ThrowIfCancellationRequested();
21                 }
22             }
23 
24             return await originalTask;
25         }
26 
27         public static async Task Go()
28         {
29             //在指定的延迟(以毫秒为单位)后将被取消。
30             var cts = new CancellationTokenSource(5000);
31             var ct = cts.Token;
32 
33             try
34             {
35                 Task<Int64> t = new Task<Int64>(() =>
36                 {
37                     //Task.Delay不阻塞线程,任务不会被取消(5秒后早执行完了)
38                     //Task.Delay(10000);
39 
40                     //阻塞线程,10秒后收到取消通知
41                     Thread.Sleep(10000);
42                     return 0;
43                 });
44                 t.Start();
45 
46                 //调用扩展方法取消任务
47                 await t.WithCancellation(ct);
48 
49                 Console.WriteLine("Task completed");
50             }
51             catch (OperationCanceledException)
52             {
53                 Console.WriteLine("Task cancelled");
54             }
55         }
56     }

 

转载于:https://www.cnblogs.com/xuejietong/p/8971536.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值