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