WebEnh

.net7 mvc jquery bootstrap json 学习中 第一次学PHP,正在研究中。自学进行时... ... 我的博客 https://enhweb.github.io/ 不错的皮肤:darkgreentrip,iMetro_HD
随笔 - 1079, 文章 - 1, 评论 - 75, 阅读 - 174万
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

任务Task系列之使用CancellationToken取消Task

Posted on   WebEnh  阅读(187)  评论(0编辑  收藏  举报

  本文参考书籍《CLR via C#》

  Task的取消采用一种形如令牌(Token)的方式。首先先构建一个CancellationTokenSource实例,然后任务中执行的方法必须能接受一个CancellationToken类型的参数。

  假设我们有这样一个方法:

复制代码
复制代码
private static Int32 NumValue(CancellationToken token, Int32 n)
        {
            Int32 sum = 0;
            for (int i = 0; i < n; i++)
            {
                token.ThrowIfCancellationRequested();
                checked
                {
                    sum += i;
                }
            }
            return sum;
        }
复制代码
复制代码

  上述代码中的循环中调用CancellationToken的ThrowIfCancellationRequested()方法定时检查操作是否已经取消,这个方法与CancellationToken的IsCancellationRequested属性作用一致,如果CancellationTokenSource已经取消,ThrowIfCancellationRequested()会抛出一个异常表示当前任务已经被取消。

  我们创建Task和CancellationTokenSource的对象:

复制代码
复制代码
 private static void TaskRun()
        {
            CancellationTokenSource tokenSource = new CancellationTokenSource();
            Task<Int32> task = Task.Run(() => NumValue(tokenSource.Token, 1000000), tokenSource.Token);

            //发出取消的请求
            tokenSource.Cancel();

            try
            {
                Console.WriteLine("计算求和为:{0}",task.Result);
            }
            catch (AggregateException ex)
            {
                ex.Handle(e => e is OperationCanceledException);
                Console.WriteLine("用户已取消");
            }
        }
复制代码
复制代码

  可在创建Task时将一个CancellationToken传给构造器,从而将两者相关联,如果CancellationToken在Task调度前取消,那么Task就会被取消,永远都不执行。但如果Task已调度,那么Task的代码就只支持显示取消,其操作才能在执行期间取消,遗憾的是,虽然Task关联了一个CancellationToken,但却没有办法访问他。因此,必须在Task的代码中获得创建Task对象时的同一个CancellationToken。为此,最简单的办法就是使用一个Lamda表达式,将CancellationToken作为闭包变量传递。

 
分类: 并行编程
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

了解更多