C# Task 取消任务 CancellationTokenSource
Task取消任务可以使用取消令牌CancellationTokenSource实现
先说CancellationTokeSource这个类,它主要的功能是向应该被取消的 System.Threading.CancellationToken 发送信号。
我们一般常用到的属性就是:Token 这个属性
方法是:Cannel()取消 、IsCancellationRequested()是否已经取消
CancellationToken这个就是一个Token,常用的方法有
//取消后执行的回调委托,这里面还有一些重写,就不多介绍了
public CancellationTokenRegistration Register(Action callback);
//判断是否已经取消
public bool IsCancellationRequested { get; }
//取消的话就抛出一个异常
public void ThrowIfCancellationRequested();
Task的构造函数里面就有CancellationToken这一个参数,这是给这个Task绑定一个Token。
Task绑定后,取消有两种情况,一是Task还没启动,就被取消了。这时候Task里面的代码都不会执行。二是Task已经执行了,这时候取消,Task是不会受到影响,会继续全部执行完的。想要再中间停止Task,就需要另外加判断,使用ThrowIfCancellationRequested()方法也可以直接终止。目前我还没找到取消就直接终止Task的优雅的办法。
class Program
{
//做对比
// static CancellationTokenSource cts = new CancellationTokenSource();
static void Main(string[] args)
{
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
//CancellationToken cancellationToken = new CancellationToken();
cancellationTokenSource.Token.Register(() => { Console.WriteLine("线程被取消了"); });
// cts.Token.Register(()=> { Console.WriteLine("线程被取消了2"); });
//cancellationTokenSource.Cancel();
//Task.Run(Method1, cancellationTokenSource.Token);
Task.Run(Method2, cancellationTokenSource.Token);
Thread.Sleep(100);
cancellationTokenSource.Cancel();
// cts.Cancel();
Console.WriteLine("UI stop...");
Console.ReadLine();
}
public static void Method1()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Method1... "+Environment.CurrentManagedThreadId);
}
}
public static void Method2()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Method2... "+i.ToString());
Thread.Sleep(50);
}
}
}

浙公网安备 33010602011771号