写在前面
在Task创建并执行后,如果状态发生了变化,需要取消正在执行中的Task,除了使用主线程上的共享变量来判断之外,更优雅的方式就是就是用CancellationTokenSource来取消任务的执行。
代码实现
public static void CancelTaskTest01(){var source = new CancellationTokenSource();// 注册Task被取消后的处理方法source.Token.Register(() => {Console.WriteLine("通知 task01 被取消了");});var counter = 1;var task01 = new Task(() => {while (!source.IsCancellationRequested){Thread.Sleep(2000);Console.WriteLine($"第{counter++}次");}if (source.IsCancellationRequested){Console.WriteLine($"第{counter}次真正结束");}});task01.Start();// 9秒后取消task01,由于第5次执行的时候已经通过了判断,所以事实上是第6次才被取消source.CancelAfter(9000);}
执行结果