咱们在多线程中一般使用一个bool IsExit
相似的代码来控制是否线程的运行与终止,其实使用CancellationTokenSource来进行控制更为好用,下面咱们将介绍CancellationTokenSource相关用法。html
C# 使用 CancellationTokenSource 终止线程
使用CancellationTokenSource对象须要与Task对象进行配合使用,Task会对当前运行的状态进行控制(这个不用咱们关心是如何孔控制的)。而CancellationTokenSource则是外部对Task的控制,如取消、定时取消。多线程
下面咱们来看看示例代码函数
- class Program
- {
- //声明CancellationTokenSource对象
- static CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
-
- //程序入口
- static void Main(string[] args)
- {
- Task.Factory.StartNew(MyTask, cancelTokenSource.Token);
-
- Console.WriteLine("请按回车键(Enter)中止");
- Console.ReadLine();
-
- cancelTokenSource.Cancel();
-
- Console.WriteLine("已中止");
- Console.ReadLine();
- }
-
- //测试方法
- static void MyTask()
- {
- //判断是否取消任务
- while (!cancelTokenSource.IsCancellationRequested)
- {
- Console.WriteLine(DateTime.Now);
- Thread.Sleep(1000);
- }
- }
- }
运行效果如图测试
Task.Factory.StartNew 建立并启动了 MyTask 方法,并传递了一个 CancellationTokenSource.Token 对象进去。咱们能够经过在外部CancellationTokenSource对象进行控制是否取消任务的运行。spa
当在 MyTask 中的 cancelTokenSource.IsCancellationRequested 判断若是是取消了任务的话 就跳出while循环执行。也就结束了任务线程
咱们还可使用计时取消任务,当一个任务超过了咱们所设定的时间而后自动取消该任务的执行。以下代码所示code
- var cancelTokenSource = new CancellationTokenSource(3000);
除了构造函数,咱们还可使用另一种方式实现定时取消,以下代码所示htm
- cancelTokenSource.CancelAfter(3000);
运行起来效果是同样的,3秒钟定时取消。对象
多个 CancellationTokenSource 复合
在有多个CancellationTokenSource须要一块儿并行管理的时候,好比任意一个任务取消 则取消全部任务。咱们没必要去一个一个的去关闭,只须要将须要一块儿并行关闭的CancellationTokenSource组合起来就好了。以下代码所示,执行结果是跟上面的图同样的。我就再也不上图了。get
- class Program
- {
- //声明CancellationTokenSource对象
- static CancellationTokenSource c1 = new CancellationTokenSource();
- static CancellationTokenSource c2 = new CancellationTokenSource();
- static CancellationTokenSource c3 = new CancellationTokenSource();
-
- //使用多个CancellationTokenSource进行复合管理
- static CancellationTokenSource compositeCancel = CancellationTokenSource.CreateLinkedTokenSource(c1.Token, c2.Token, c3.Token);
-
- //程序入口
- static void Main(string[] args)
- {
- Task.Factory.StartNew(MyTask, compositeCancel.Token);
-
- Console.WriteLine("请按回车键(Enter)中止");
- Console.ReadLine();
-
- //任意一个 CancellationTokenSource 取消任务,那么全部任务都会被取消。
- c1.Cancel();
-
- Console.WriteLine("已中止");
- Console.ReadLine();
- }
-
- //测试方法
- static void MyTask()
- {
- //判断是否取消任务
- while (!compositeCancel.IsCancellationRequested)
- {
- Console.WriteLine(DateTime.Now);
- Thread.Sleep(1000);
- }
- }
- }
以上代码调用了c1.Cancel();
触发了MyTask()
方法中的compositeCancel.IsCancellationRequested
为true,则取消了任务。因此咱们在全部任务中判断复合的这个CancellationTokenSource对象便可。
转载自:http://www.wxzzz.com/689.html