C# 使用CancellationTokenSource取消多線程
有時間我們在使用多線程的時候,需要取消線程的執(zhí)行,可以使用CancellationTokenSource來取消對Task開辟多線程的取消
如下:我們點擊一個按鈕開啟線程,然后點擊取消按鈕取消該線程的執(zhí)行

CancellationTokenSource cts ;
/// <summary>
/// 開啟線程
/// </summary>
private void button1_Click(object sender, EventArgs e)
{
//重新實例化cts.Token就會不一樣,不然再次點擊的時候會報錯,提示線程已經執(zhí)行完畢
cts = new CancellationTokenSource();
Task task = new Task(() =>
{
Thread.Sleep(1500);
try
{
cts.Token.ThrowIfCancellationRequested();
MessageBox.Show("線程被執(zhí)行");
}
catch (Exception ex)
{
MessageBox.Show("線程被取消");
}
}, cts.Token);
task.Start();
//如果放到這里有可能線程還沒有開始執(zhí)行就被取消了
//cts.Cancel(true);
}
/// <summary>
/// 取消線程
/// </summary>
private void button2_Click(object sender, EventArgs e)
{
cts.Cancel();
}

幾點關鍵問題解釋:
1:為什么線程里邊去調用 Thread.Sleep(1500);
因為如果不讓線程暫停一下,你在點擊開啟線程后。還沒有來得及點擊取消線程,線程都已經執(zhí)行完畢了這個時候
再去取消線程是沒有什么意義的。
2: cts.Cancel()
這句話其實只是設置一個狀態(tài),設置該對象一個熟悉為true而已,也就是設置cts.IsCancellationRequested為ture。
所以他根本沒有真正的去取消線程的執(zhí)行,只是設置一個狀態(tài)而已。
3:cts.Token.ThrowIfCancellationRequested();
因為上面說的cts.Cancel()只是設置一個狀態(tài)而已,線程不會真正被取消。其實線程開啟后,現(xiàn)在都是要執(zhí)行完的,
我們并不能真正去取消線程的執(zhí)行,只是從邏輯上去取消線程需要處理的邏輯。
這句話的意思其實就是檢查cts.Cancel()設置的屬性狀態(tài),也就是cts.IsCancellationRequested是否為true,如果為
true就拋出一個異常,從而終止線程的執(zhí)行
也就是說其實這句話完全可以我們自己來實現(xiàn)

同時取消多個線程:
同時取消多個線程,其實也很簡單,我們不需要有多少個線程就去實例化多少個CancellationTokenSource,
多個線程綁定頂一個CancellationTokenSource的token然后調用該對象的cancel就可以同時取消多個線程了。
CancellationTokenSource cts;
/// <summary>
/// 開啟線程
/// </summary>
private void button1_Click(object sender, EventArgs e)
{
//重新實例化cts.Token就會不一樣,不然再次點擊的時候會報錯,提示線程已經執(zhí)行完畢
cts = new CancellationTokenSource();
for (int i = 0; i < 5; i++)
{
Task task = new Task((obj) =>
{
Thread.Sleep(1500);
try
{
//cts.Token.ThrowIfCancellationRequested();
//檢查狀態(tài),檢查線程是否已經被取消,如果取消則自己跑出來一個線程
if (cts.Token.IsCancellationRequested)
throw new OperationCanceledException();
MessageBox.Show("線程" + obj + "被執(zhí)行");
}
catch (Exception ex)
{
MessageBox.Show("線程" + obj + "被取消");
}
}, i, cts.Token);
task.Start();
}
//如果放到這里有可能線程還沒有開始執(zhí)行就被取消了
//cts.Cancel(true);
}
/// <summary>
/// 取消線程
/// </summary>
private void button2_Click(object sender, EventArgs e)
{
cts.Cancel();
}

到此這篇關于C# 使用CancellationTokenSource取消多線程的文章就介紹到這了,更多相關C# 使用CancellationTokenSource取消多線程內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C#利用ScriptControl動態(tài)執(zhí)行JS和VBS腳本
C#中利用ScriptControl動態(tài)執(zhí)行JS和VBS腳本的實現(xiàn)方法,需要的朋友可以參考下2013-04-04
利用微軟com組件mstscax.dll實現(xiàn)window7遠程桌面功能
利用微軟提供的com組件mstscax.dll實現(xiàn)類似window遠程桌面功能,大家參考使用吧2013-12-12
C#中datagridview使用tooltip控件顯示單元格內容的方法
這篇文章主要介紹了C#中datagridview使用tooltip控件顯示單元格內容的方法,實例分析了C#控件的相關使用技巧,需要的朋友可以參考下2016-06-06

