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);
            }
        }
    }

 

posted @ 2022-08-13 16:35  xunzf  阅读(2259)  评论(0)    收藏  举报