這是線程安全的最後一篇了,主要介紹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的用法。
----------------------------------------------------------------------------------------------------
注:此文章爲原創,任何形式的轉載都請聯繫做者得到受權並註明出處!
若您以爲這篇文章還不錯,請點擊下方的【推薦】,很是感謝!