C#線程安全使用(五)

 CancellationToken的多種應用

這是線程安全的最後一篇了,主要介紹CancellationToken的多種應用。安全

1,ThreadPool直接啓動線程,傳遞CancellationToken。async

2,Task啓動線程,傳遞CancellationToken。Task傳遞方式分爲兩種,一種經過Task的參數進行傳遞,另外一種經過向線程內傳遞對象的方式傳遞CancellationToken。函數

3,CancellationToken的回調函數應用。spa

話很少說,請看代碼。線程

  class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("當前線程{0},當前狀態{1}", Thread.CurrentThread.GetHashCode(), Thread.CurrentThread.ThreadState);
            //使用線程池建立線程,而後取消線程
            CancelWithThreadPoolMiniSnippet();
        }
        static CancellationTokenSource cts = new CancellationTokenSource();
        static CancellationToken token = cts.Token;
        static void CancelWithThreadPoolMiniSnippet()
        {
            Console.WriteLine("當前線程{0},當前狀態{1}", Thread.CurrentThread.GetHashCode(), Thread.CurrentThread.ThreadState);

            #region 使用QueueUserWorkItem的構造函數,傳遞cts.Token,但我不喜歡這個模式 跟蹤不了狀態
            //ThreadPool.QueueUserWorkItem(new WaitCallback(DoSomeWork), ctn);
            #endregion

            #region 使用傳遞參數的模式 傳遞CancellationToken,這裏的cts.Token是做爲Action的參數傳遞的
            //var action = new Action<object>(DoSomeWork);
            //Task t = new Task(action, ctn);
            //t.Start();
            //Console.WriteLine("開始,當前線程{0},當前狀態{1}", t.GetHashCode(), t.Status);
            #endregion

            #region 使用Task的構造函數,傳遞cts.Token,但CancellationTokenSource要弄成全局變量,不然方法找不到,就取消不了。
            //Task t = new Task(Work, cts.Token);
            //t.Start();
            #endregion

            #region 註冊回調函數,當CancellationTokenSource.Cancel()執行後,調用回調函數 
            token.Register(CallBack, true);  //註冊回調函數
            Task t = new Task(Work);
            t.Start();
            #endregion

            Thread.SpinWait(5000000);
            
            cts.Cancel();
            Console.WriteLine("結束,當前線程{0},當前狀態{1}", t.GetHashCode(), t.Status);
            Console.Read();
        }

       
        static void DoSomeWork(object obj)
        {
            CancellationToken token = (CancellationToken)obj;
            for (int i = 0; i < 100000; i++)
            {
                Console.WriteLine(i);
                // Simulating work.
                //Thread.SpinWait(5000000);

                if (token.IsCancellationRequested)
                {
                   
                    break;
                }
            }
        }


        static void Work()
        {
           
            for (int i = 0; i < 100000; i++)
            {
                Console.WriteLine(i);
                if (token.IsCancellationRequested)
                {

                    break;
                }
            }
        }

        static void CallBack()
        {
            
            Console.WriteLine("I'm call back!"   );
        }
    }

代碼內執行結果以下,該結果爲CancellationToken的回調函數應用:對象

到此NET Framework4.0裏的線程安全就都講完了。。。。。。。blog

雖然第一篇文章是2013年,雖然歷時近五年,但請相信我,代碼早在五年前就已經寫完啦。只是我一直一直一直沒配文字發出來。。。。。。token

不過,也多是最近寫文字的能力有所提高,因此就完成了四和五。ip

否則這線程安全的文章可能還要拖。。。。。。。。哈哈回調函數

 後記

在NET Framework4.6裏,微軟提供了async和await語法,也是有關線程安全,我將會在新的語法相關文章裏講解async和await的用法。

 

----------------------------------------------------------------------------------------------------

注:此文章爲原創,任何形式的轉載都請聯繫做者得到受權並註明出處!
若您以爲這篇文章還不錯,請點擊下方的推薦】,很是感謝!

 

相關文章
相關標籤/搜索