LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

C# 使用 CancellationTokenSource 終止線程

admin
2024年3月19日 11:22 本文熱度 726

我們在多線程中通常使用一個bool IsExit類似的代碼來控制是否線程的運行與終止,其實使用CancellationTokenSource來進行控制更為好用,下面我們將介紹CancellationTokenSource相關用法。


C# 使用 CancellationTokenSource 終止線程

使用CancellationTokenSource對象需要與Task對象進行配合使用,Task會對當前運行的狀態進行控制(這個不用我們關心是如何孔控制的)。而CancellationTokenSource則是外部對Task的控制,如取消、定時取消。


下面我們來看看示例代碼:

class Program    {        //聲明CancellationTokenSource對象        static CancellationTokenSource cancelTokenSource = new CancellationTokenSource();         //程序入口        static void Main(string[] args)        {            Task.Factory.StartNew(MyTask, cancelTokenSource.Token);             Console.WriteLine("請按回車鍵(Enter)停止");            Console.ReadLine();             cancelTokenSource.Cancel();                        Console.WriteLine("已停止");            Console.ReadLine();        }         //測試方法        static void MyTask()        {            //判斷是否取消任務            while (!cancelTokenSource.IsCancellationRequested)            {                Console.WriteLine(DateTime.Now);                Thread.Sleep(1000);            }        }    }

Task.Factory.StartNew 創建并啟動了 MyTask 方法,并傳遞了一個 CancellationTokenSource.Token 對象進去。我們可以通過在外部CancellationTokenSource對象進行控制是否取消任務的運行。


當在 MyTask 中的 cancelTokenSource.IsCancellationRequested 判斷如果是取消了任務的話 就跳出while循環執行。也就結束了任務。 


我們還可以使用計時取消任務,當一個任務超過了我們所設定的時間然后自動取消該任務的執行。如下代碼所示:

var cancelTokenSource = new CancellationTokenSource(3000);

除了構造函數,我們還可以使用另外一種方式實現定時取消,如下代碼所示:

cancelTokenSource.CancelAfter(3000);

運行起來效果是一樣的,3秒鐘定時取消。

 


多個 CancellationTokenSource 復合

在有多個CancellationTokenSource需要一起并行管理的時候,比如任意一個任務取消 則取消所有任務。我們不必去一個一個的去關閉,只需要將需要一起并行關閉的CancellationTokenSource組合起來就行了。如下代碼所示,執行結果是跟上面的圖一樣的。我就不再上圖了。

class Program    {        //聲明CancellationTokenSource對象        static CancellationTokenSource c1 = new CancellationTokenSource();        static CancellationTokenSource c2 = new CancellationTokenSource();        static CancellationTokenSource c3 = new CancellationTokenSource();         //使用多個CancellationTokenSource進行復合管理        static CancellationTokenSource compositeCancel = CancellationTokenSource.CreateLinkedTokenSource(c1.Token, c2.Token, c3.Token);         //程序入口        static void Main(string[] args)        {            Task.Factory.StartNew(MyTask, compositeCancel.Token);             Console.WriteLine("請按回車鍵(Enter)停止");            Console.ReadLine();             //任意一個 CancellationTokenSource 取消任務,那么所有任務都會被取消。            c1.Cancel();                        Console.WriteLine("已停止");            Console.ReadLine();        }         //測試方法        static void MyTask()        {            //判斷是否取消任務            while (!compositeCancel.IsCancellationRequested)            {                Console.WriteLine(DateTime.Now);                Thread.Sleep(1000);            }        }    }

以上代碼調用了c1.Cancel();觸發了MyTask()方法中的compositeCancel.IsCancellationRequested為true,則取消了任務。所以我們在所有任務中判斷復合的這個CancellationTokenSource對象即可。


該文章在 2024/3/19 11:22:07 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
思思热免费精品在线看看 | 午夜在线中文字幕在线播放 | 亚洲免费人a成电影 | 日韩一区视频蜜桃 | 欧美综合精品专区 | 亚洲码一区二区在线 |