C# 使用CancellationTokenSource取消多線程
有時間我們在使用多線程的時候,需要取消線程的執行,可以使用CancellationTokenSource來取消對Task開辟多線程的取消
如下:我們點擊一個按鈕開啟線程,然後點擊取消按鈕取消該線程的執行
CancellationTokenSource cts ; /// <summary> /// 開啟線程 /// </summary> private void button1_Click(object sender, EventArgs e) { //重新實例化cts.Token就會不一樣,不然再次點擊的時候會報錯,提示線程已經執行完畢 cts = new CancellationTokenSource(); Task task = new Task(() => { Thread.Sleep(1500); try { cts.Token.ThrowIfCancellationRequested(); MessageBox.Show("線程被執行"); } catch (Exception ex) { MessageBox.Show("線程被取消"); } }, cts.Token); task.Start(); //如果放到這裡有可能線程還沒有開始執行就被取消瞭 //cts.Cancel(true); } /// <summary> /// 取消線程 /// </summary> private void button2_Click(object sender, EventArgs e) { cts.Cancel(); }
幾點關鍵問題解釋:
1:為什麼線程裡邊去調用 Thread.Sleep(1500);
因為如果不讓線程暫停一下,你在點擊開啟線程後。還沒有來得及點擊取消線程,線程都已經執行完畢瞭這個時候
再去取消線程是沒有什麼意義的。
2: cts.Cancel()
這句話其實隻是設置一個狀態,設置該對象一個熟悉為true而已,也就是設置cts.IsCancellationRequested為ture。
所以他根本沒有真正的去取消線程的執行,隻是設置一個狀態而已。
3:cts.Token.ThrowIfCancellationRequested();
因為上面說的cts.Cancel()隻是設置一個狀態而已,線程不會真正被取消。其實線程開啟後,現在都是要執行完的,
我們並不能真正去取消線程的執行,隻是從邏輯上去取消線程需要處理的邏輯。
這句話的意思其實就是檢查cts.Cancel()設置的屬性狀態,也就是cts.IsCancellationRequested是否為true,如果為
true就拋出一個異常,從而終止線程的執行
也就是說其實這句話完全可以我們自己來實現
同時取消多個線程:
同時取消多個線程,其實也很簡單,我們不需要有多少個線程就去實例化多少個CancellationTokenSource,
多個線程綁定頂一個CancellationTokenSource的token然後調用該對象的cancel就可以同時取消多個線程瞭。
CancellationTokenSource cts; /// <summary> /// 開啟線程 /// </summary> private void button1_Click(object sender, EventArgs e) { //重新實例化cts.Token就會不一樣,不然再次點擊的時候會報錯,提示線程已經執行完畢 cts = new CancellationTokenSource(); for (int i = 0; i < 5; i++) { Task task = new Task((obj) => { Thread.Sleep(1500); try { //cts.Token.ThrowIfCancellationRequested(); //檢查狀態,檢查線程是否已經被取消,如果取消則自己跑出來一個線程 if (cts.Token.IsCancellationRequested) throw new OperationCanceledException(); MessageBox.Show("線程" + obj + "被執行"); } catch (Exception ex) { MessageBox.Show("線程" + obj + "被取消"); } }, i, cts.Token); task.Start(); } //如果放到這裡有可能線程還沒有開始執行就被取消瞭 //cts.Cancel(true); } /// <summary> /// 取消線程 /// </summary> private void button2_Click(object sender, EventArgs e) { cts.Cancel(); }
到此這篇關於C# 使用CancellationTokenSource取消多線程的文章就介紹到這瞭,更多相關C# 使用CancellationTokenSource取消多線程內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!