- CancellationTokenSource用于取消基于Task建立的线程(单个线程、多个线程都可以)。
- 定时取消也是可以的。
- 可以通过合并多个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已跳出循环");
}
}
}
执行结果: