C#中的CancellationTokenSource

  1. CancellationTokenSource用于取消基于Task建立的线程(单个线程、多个线程都可以)。
  2. 定时取消也是可以的。
  3. 可以通过合并多个cts,达到其中一个任务取消,则任务全部取消的效果。

参考资料:

https://www.cnblogs.com/majiang/p/7920102.html(目前还看不懂)

https://www.cnblogs.com/luohengstudy/p/5623451.html

以下是本人调试时的代码:

代码1:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace 取消单个任务
{
    class Program
    {
        //声明CancellationTokenSource对象
        static CancellationTokenSource cts = new CancellationTokenSource();

        static void Main(string[] args)
        {
            Console.WriteLine("==========取消单个任务==========");

            //将cts.Token传入任务中,在外部通过控制cts实现对任务的控制
            Task.Factory.StartNew(MyTask, cts.Token);

            Console.WriteLine("请按回车键停止");
            Console.ReadLine();

            cts.Cancel();//传达取消请求

            Console.WriteLine("已停止");
            Console.ReadLine();
        }

        static void MyTask()
        {
            //判断任务是否取消,如果取消则跳出本次循环
            while (!cts.IsCancellationRequested)
            {
                Console.WriteLine("当前时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
                Thread.Sleep(1000);
            }
        }
    }

    /*
     * 注:
     * 还可以计时取消任务。当一个任务超过了我们所设定的时间后自动取消该任务的执行。
     * 有两种方式实现(.net4.5以上):
     * 方式1:
     * var cts = new CancelTokenSource(3000);
     * 方式2:
     * cts.CancelAfter(3000);
     * 
     * */
}

执行结果:

代码2:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace 取消多个任务
{
    class Program
    {
        //在有多个CancellationTokenSource需要并行管理时,比如任意一个任务取消就取消所有任务时,我们不必一个一个去取消。
        //可以把并行的CancellationTokenSource组合在一起,一并管理。

        //定义需要一并管理的cts
        static CancellationTokenSource cts1 = new CancellationTokenSource();
        static CancellationTokenSource cts2 = new CancellationTokenSource();
        static CancellationTokenSource cts3 = new CancellationTokenSource();

        //创建一个将在任何源处于取消状态时处于取消状态的cts
        static CancellationTokenSource ctsCombine = CancellationTokenSource.CreateLinkedTokenSource(cts1.Token, cts2.Token, cts3.Token);

        static void Main(string[] args)
        {
            Console.WriteLine("==========取消多个任务==========");

            Task.Factory.StartNew(MyTask1, ctsCombine.Token);
            Task.Factory.StartNew(MyTask2, ctsCombine.Token);
            Task.Factory.StartNew(MyTask3, ctsCombine.Token);

            Console.WriteLine("按回车键执行cts1.Cancel()");
            Console.ReadLine();

            cts1.Cancel();

            Console.ReadLine();
        }

        static void MyTask1()
        {
            while (!ctsCombine.IsCancellationRequested)
            {
                Console.WriteLine("MyTask1:" + DateTime.Now);
                Thread.Sleep(1000);
            }

            Console.WriteLine("MyTask1已跳出循环");
        }

        static void MyTask2()
        {
            while (!ctsCombine.IsCancellationRequested)
            {
                Console.WriteLine("MyTask2:" + DateTime.Now);
                Thread.Sleep(1000);
            }

            Console.WriteLine("MyTask2已跳出循环");
        }

        static void MyTask3()
        {
            while (!ctsCombine.IsCancellationRequested)
            {
                Console.WriteLine("MyTask3:" + DateTime.Now);
                Thread.Sleep(1000);
            }

            Console.WriteLine("MyTask3已跳出循环");
        }
    }
}

执行结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值