CancellationTokenSource的简单用法

CancellationTokenSource向应该被取消的 System.Threading.CancellationToken 发送信号,听起来不好理解,简单理解就是可以取消线程,上代码

  //定义一个取消线程的变量
        CancellationTokenSource cancellationTokenSource;

        private void simpleButton1_Click(object sender, EventArgs e)
        {
            cancellationTokenSource = new CancellationTokenSource();

            Task task = Task.Run(()=> 
            {
                Thread.Sleep(5000);

                Console.WriteLine(Thread.CurrentThread.GetHashCode());

                try
                {
                    cancellationTokenSource.Token.ThrowIfCancellationRequested();
                    MessageBox.Show("该线程还活着");
                }
                catch (Exception ex)
                {
                    MessageBox.Show("该线程已取消");
                }

                Console.WriteLine(Thread.CurrentThread.GetHashCode());
            });
        }

        private void simpleButton2_Click(object sender, EventArgs e)
        {
            if (cancellationTokenSource == null) return;
            cancellationTokenSource.Cancel();
        }

操作步骤:点击开始线程然后立刻点击取消线程按钮。

点击开始线程按钮的时候,创建一个线程,首先让线程沉睡5秒,便于可以点击取消线程按钮, cancellationTokenSource.Token.ThrowIfCancellationRequested() 这个方法中如果取消了线程这个方法会引发System.OperationCanceledException异常,结果如下:

然后看一下控制台发现后面的那一句记录线程的hashcode的值依旧被输出了出来

调用Cancel()方法的时候线程没有被取消么?看了资料后了解到调用Cancel()方法后只是会做一个标记,会把此线程IsCancellationRequested状态设置成true,线程是不会真的被结束的,只能通过逻辑处理,抛出异常来打断线程。

     if (cancellationTokenSource.IsCancellationRequested)
         {
            MessageBox.Show("该线程已取消");
            throw new OperationCanceledException();
         }
     else
         {
            MessageBox.Show("该线程还活着");
         }

异常抛出后结果

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值