C 從外部取消任務的執行

2021-10-09 11:20:25 字數 1487 閱讀 7334

根據微軟官方文件,推薦用tap模式編寫非同步程式,提供了用於取消task的 cancellationtoken 標記,實際應用中可以new 乙個cancellationtokensource物件。當我們需要乙個迴圈執行的機制時(在thread方式下通常是用thread.sleep,在task下就是await task.delay),需要停下來時,由於執行緒或task從外部都是無法停止的,要在內部通過這個 cancellationtoken 來自行停下來, 那麼就有兩個選擇:

每次迴圈開始時,使用 cancellationtoken.iscancellationrequested 判斷要不要停下來;在task.delay裡面加上cancellationtoken引數,然後截獲task.delay丟擲的 operationcanceledexception 異常。

以delay 50ms為例,測試結果表明,cancel前等待時間 方法1要短於方法2,估計方法2的 throw-try-catch 代價比較高,推薦使用方法1

方法1,只通過 iscancellationrequested 測試:

static void main(string args)

static async void testcancel1(system.threading.cancellationtoken cancellationtoken)

console.writeline(datetime.now.tostring("hh:mm:ss fff") + " cancelled");

}//09:50:18 286

//09:50:18 413

//09:50:18 474

//09:50:18 527

//09:50:18 587

//09:50:18 603 cancel...

//09:50:18 649 cancelled

方法2,通過 iscancellationrequested 和 delay(50,cancellationtoken) 截獲異常:

static void main(string args)

static async void testcancel2(system.threading.cancellationtoken cancellationtoken)

console.writeline(datetime.now.tostring("hh:mm:ss fff") + " cancelled");

} catch(operationcanceledexception ex) }

//09:53:50 718

//09:53:50 843

//09:53:50 900

//09:53:50 964

//09:53:51 029

//09:53:51 031 cancel...

//09:53:51 808 throwed

linux定時執行任務後怎麼取消

使用crontab e命令,開啟任務程式檔案,然後刪除指定的任務即可。crontab命令說明如下 crontab命令被用來提交和管理使用者的需要週期性執行的任務,與windows下的計畫任務類似,當安裝完成作業系統後,缺省會安裝此服務工具,並且會自動啟動crond程序,crond程序每分鐘會定期檢查...

併發程式設計實戰 8 任務的執行與取消

單執行緒順序執行任務,效率過低,沒有發揮多核的優勢。為每個任務分配乙個執行緒去執行,速度有所提公升,但是有很大的缺陷。生產環境中,每乙個任務分配乙個執行緒的方法存在一些缺陷,尤其是需要建立大量的執行緒時 提供一種標準的方法將任務的提交過程與執行過程解耦,並用runnable來表示任務。executo...

Android執行緒池中的任務取消

executorservice pool executors.newfixedthreadpool 2 建立實現了runnable介面物件,thread物件當然也實現了runnable介面 thread t1 new mythread thread t2 new mythread thread t3...