- 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已跳出循环");
-
}
-
}
-
}
执行结果:
- CancellationTokenSource用于取消基于Task建立的线程(单个线程、多个线程都可以)。
- 定时取消也是可以的。
- 可以通过合并多个cts,达到其中一个任务取消,则任务全部取消的效果。
参考资料: