private void button1_Click(object sender, EventArgs e) { //定義一個爲可取消資源標誌 CancellationTokenSource cts = new CancellationTokenSource(); //定義二個爲可取消資源標誌 CancellationTokenSource cts1 = new CancellationTokenSource(); //實現一個可取消操做的回調函數, ThreadPool.QueueUserWorkItem(o => Count(cts.Token, 1000000)); //爲可取消資源標誌註冊取消後的回調函數(無參,無返回值,匿名委託) cts.Token.Register(() => Console.WriteLine("Canceled 1")); //爲可取消資源標誌註冊取消後的回調函數(有參,無返回值,顯式申明委託) cts.Token.Register(o => TestCancellationMethead(1000, 10), true); cts1.Token.Register(() => Console.WriteLine("Canceled 2")); ///鏈接兩個可取消資源標誌 var LinkedCts = CancellationTokenSource.CreateLinkedTokenSource(cts.Token, cts1.Token); ///給鏈接後的可取消資源標誌集註冊回調函數(匿名委託),集合中任意一個可取消資源標誌取消,都將觸發該回調函數 LinkedCts.Token.Register(() => Console.WriteLine("linkedCts canceled")); Thread.Sleep(300); cts.Cancel(); } void TestCancellationMethead(int x, int y) { Console.WriteLine("取消後的回調函數" + x + y); } /// <summary> /// 一個可取消操做的回調函數,函數的關鍵是傳入一個CancellationToken對象 /// </summary> /// <param name="token"></param> /// <param name="countTo"></param> void Count(CancellationToken token, Int32 countTo) { Console.WriteLine("一個可取消的操做開始執行"); for (int count = 0; count < countTo; count++) { if (token.IsCancellationRequested) { Console.WriteLine("$" + count.ToString()); Console.ReadLine(); break; } Console.WriteLine("|" + count.ToString()); Console.ReadLine(); } }
bool IsCancellationRequested = false; private void button2_Click(object sender, EventArgs e) { ThreadPool.QueueUserWorkItem(o => Count(1000000)); Thread.Sleep(300); IsCancellationRequested = true; } void Count(Int32 countTo) { Console.WriteLine("一個可取消的操做開始執行"); for (int count = 0; count < countTo; count++) { if (IsCancellationRequested) { Console.WriteLine("一個可取消的操做被取消" + count.ToString()); break; } Console.WriteLine(count.ToString()); } }