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


      本文参考书籍《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;
            }

      上述代码中的循环中调用CancellationTokenThrowIfCancellationRequested()方法定时检查操作是否已经取消,这个方法与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作为闭包变量传递。

  • 相关阅读:
    Kubernetes1.91(K8s)安装部署过程(一)--证书安装
    开源仓库Harbor搭建及配置过程
    有关centos7 图形化root用户登录
    linux服务器查看tcp链接shell
    django表格form无法保存评论排查步骤
    Redis 4.x 安装及 发布/订阅实践和数据持久化设置
    django博客项目-设置django为中文语言
    windows 环境下如何使用virtualenv python环境管理工具
    【转载】python中利用smtplib发送邮件的3中方式 普通/ssl/tls
    php安装phpize工具
  • 原文地址:https://www.cnblogs.com/mohanchen/p/9398031.html
Copyright © 2020-2023  润新知