『技術群里聊些啥』Task 不是你想 Cancel,想 Cancel 就能 Cancel

前言

在群里看到有人問如何取消這個 Task 的執行:

fcfc3f78d50bf90f6f4e76d2e55afd7c.png

實際上這并不會取消S1eepMode1方法的執行:

a79ba5572524a1ab1bb9225d97e66af0.png

這是為什么呢?

原因

首先,讓我們看看s_cts.Cancel()都做了啥:

public?void?Cancel()?=>?Cancel(false);public?void?Cancel(bool?throwOnFirstException)
{ThrowIfDisposed();NotifyCancellation(throwOnFirstException);
}private?void?NotifyCancellation(bool?throwOnFirstException)
{//?If?we're?the?first?to?signal?cancellation,?do?the?main?extra?work.if?(!IsCancellationRequested?
&&?Interlocked.CompareExchange(ref?_state,?NotifyingState,?NotCanceledState)?==?NotCanceledState){...}
}

實際上,Cancel方法僅僅是將變量_state的值改為NotifyingState

Task.Run傳遞s_cts.Token又有什么用呢?

public?static?Task<TResult>?Run<TResult>(Func<Task<TResult>?>?function,?CancellationToken?cancellationToken)
{if?(function?==?null)?ThrowHelper.ThrowArgumentNullException(ExceptionArgument.function);//?Short-circuit?if?we?are?given?a?pre-canceled?tokenif?(cancellationToken.IsCancellationRequested)return?Task.FromCanceled<TResult>(cancellationToken);...
}

原來,是在創建 Task 前先檢查令牌是否已經Cancel,以便快速終止。

那么,到底怎么才能Cacel已創建的Task呢?

實現

其實,Task.Run的方法實現已經告訴我們正確的解決方案,那就是判斷cancellationToken.IsCancellationRequested:

public?static?async?Task?S1eepMode1(CancellationToken?cancellationToken)
{while?(true){if?(cancellationToken.IsCancellationRequested)return;...}
}

另外,也可以采取拋出異常的方式:

public?static?async?Task?S1eepMode1(CancellationToken?cancellationToken)
{while?(true){cancellationToken.ThrowIfCancellationRequested();...}
}

示例應用程序并不會捕獲到這個異常,相關問題可以看我以前的文章《如何保證執行異步方法時不會遺漏 await 關鍵字》

結論

在創建 Task 時請記住,即使你執行了令牌取消操作,也并不意味著 Task 會停止運行。

添加微信號【MyIO666】,邀你加入技術交流群

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287791.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287791.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287791.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL Server數據庫鎖的類型、用法及注意事項詳解

一、為什么要引入鎖 多個用戶同時對數據庫的并發操作時會帶來以下數據不一致的問題: 丟失更新:A,B兩個用戶讀同一數據并進行修改,其中一個用戶的修改結果破壞了另一個修改的結果,比如訂票系統 臟讀:A用戶修改了數據,隨后B用戶又讀出該數據,但A用戶因為某些原因取消了對數…

Java之HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap簡單的區別

一、 HashMap 1&#xff09;底層實現 數組鏈表紅黑樹&#xff08;在JDK1.8中如果鏈表長度大于8的時候才轉換為紅黑樹) 2&#xff09;是否線程安全不支持線程的同步&#xff0c;線程不安全&#xff0c;如需同步&#xff0c;可用Collections的synchronizedMap方法或者使用Concu…

《零基礎看得懂的C語言入門教程 》——(八)了解基本數組還不是那么簡單

一、學習目標 了解數組的使用方法 目錄 C語言真的很難嗎&#xff1f;那是你沒看這張圖&#xff0c;化整為零輕松學習C語言。 第一篇&#xff1a;&#xff08;一&#xff09;脫離學習誤區 第二篇&#xff1a;&#xff08;二&#xff09;C語言沒那么難簡單開發帶你了解流程 第…

推導坐標旋轉公式(轉)

在《Flash actionScript 3.0 動畫教程》一書中有一個旋轉公式&#xff1a; x1cos(angle)*x-sin(angle)*y; y1cos(angle)*ysin(angle)*x; 其中x&#xff0c;y表示物體相對于旋轉點旋轉angle的角度之前的坐標&#xff0c;x1&#xff0c;y1表示物體旋轉angle后相對于旋轉點的坐標 …

任務管理平臺_jytask一個任務調度統一管理平臺

task介紹和使用https://gitee.com/yuejing/task 下的文檔&#xff1a;[doc/task介紹和使用.docx]task是什么&#xff1f;task是一個任務調度統一管理平臺。 目前主要是通過http來進行任務的調度&#xff0c;http支持簽名算法。一張圖能更加懂它是做什么的(一個集中管理任務的平…

設計一個支持百萬用戶的系統

設計一個支持數百萬用戶的系統是非常有挑戰性的, 這是一個需要不斷調整和優化的過程, 接下來的內容中, 我將構建一個系統, 從單個用戶開始&#xff0c;到最后支持數百萬的用戶。從單個服務開始 千里之行&#xff0c;始于足下&#xff0c;讓我們從最簡單的單個服務開始。所有的…

SQL Server T-SQL編程:數據庫用戶與安全設置

目錄 一、數據庫的注冊、用戶建立 二 、用戶安全設置:角色

原百萬訪問量博客http://blog.chinaunix.net/uid/20656672.html不再維護(10年前數百篇oracle/teradata性能優化、故障處理案例)...

原博客地址http://blog.chinaunix.net/uid/20656672.html不再維護&#xff08;數百篇oracle/teradata性能優化、故障處理原創文章&#xff09;轉載于:https://www.cnblogs.com/zhjh256/p/5497797.html

《零基礎看得懂的C語言入門教程 》——(九)C語言二維數組與循環嵌套

一、學習目標 了解二維數組的使用方法了解循環嵌套的使用方法 目錄 C語言真的很難嗎&#xff1f;那是你沒看這張圖&#xff0c;化整為零輕松學習C語言。 第一篇&#xff1a;&#xff08;一&#xff09;脫離學習誤區 第二篇&#xff1a;&#xff08;二&#xff09;C語言沒那么…

LRU算法

1 LRU算法 LRU(Least recently used,最近最少使用)根據數據的歷史訪問記錄來進行淘汰數據,思想是“如果數據最近被訪問過,那么將來被訪問的幾率也更高”。 2 具體實現過程 新數據插入到鏈表頭部; 每當緩存命中(即緩存數據被訪問),則將數據移到鏈表頭部; 當鏈表滿…

Scala-2.13.0 安裝及配置

Scala 簡介 Scala 是一門多范式&#xff08;multi-paradigm&#xff09;的編程語言&#xff0c;設計初衷是要集成面向對象編程和函數式編程的各種特性。 Scala 運行在Java虛擬機上&#xff0c;并兼容現有的Java程序。 Scala 源代碼被編譯成Java字節碼&#xff0c;所以它可以運…

檢測python進程是否存活

crontab -e */3 * * * * /data/log_realtime/check.sh > /data/log_realtime/check.log 2>&1 1 0 1 * * /data/jx3log_import_realtime/shutdown.sh 說明&#xff1a;每3分鐘檢查一次進程是否存在&#xff0c;每個月1號0點1分殺掉進程&#xff0c;重啟 check.sh cd …

中科大鏡像源_JETPACK4.4安裝軟件和備份鏡像的方法介紹

一、使用SDK Manager的文件夾安裝Jetson軟件(以NX為例)當JETPACK安裝出現錯誤的時候&#xff0c;可以嘗試下面的安裝辦法&#xff0c;前提是JETPACK4.4完整安裝(即本文第三節的下載已經完成)&#xff0c;并且選擇JETSON NX的相關的下載已經完成。安裝步驟&#xff1a;1、$cd /n…

站在前人的肩膀上重新透視C# SpanT數據結構

先談一下我對Span的看法&#xff0c; Span是指向任意連續內存空間的類型安全、內存安全的視圖&#xff0c;可操作的滑動窗口。Span和Memory都是包裝了可以在pipeline上使用的結構化數據的內存緩沖器,他們被設計用于在pipeline中高效傳遞數據。定語解讀這里面許多定語&#xff0…

集合學習

List集合&#xff1a;ArrayList集合基于動態數組結構&#xff0c;查詢優&#xff0c;LinkedList 基于鏈表結構 數據移動優。是一個有序的隊列集合 set集合&#xff1a;HashSet和TreeSet 。是一個無序不重復集合 Map集合&#xff1a;HashMap和TreeMap。是一個KEY-VALUE映射的集合…

《零基礎看得懂的C語言入門教程 》——(十)C語言的指針原來是這樣

一、學習目標 了解指針的概念了解指針的使用方法了解雙重指針 目錄 C語言真的很難嗎&#xff1f;那是你沒看這張圖&#xff0c;化整為零輕松學習C語言。 第一篇&#xff1a;&#xff08;一&#xff09;脫離學習誤區 第二篇&#xff1a;&#xff08;二&#xff09;C語言沒那…

T-SQL編程基礎之一:變量與基本語句

一個標準的計算機語言,大概要提供的必要主要功能是:變量說明、分支判斷、循環和輸入輸出結果。T-SQL也一樣,具有這些功能,只不過T-SQL的輸入和輸出不是界面,而是表。 完全精確描述一個計算機語言,大概要很厚的書才能做到,好在目前這些書籍的發行也很多,許多書描述的都…

Java之volatile如何保證可見性和指令重排序

1 我們先了解CPU緩存 CPU緩存為了解決CPU運算速度與內存讀寫速度不匹配的問題&#xff0c;因為CPU運算速度要比內存讀寫速度快得多 一次主內存的訪問通常在幾十到幾百個時鐘周期一次L1高速緩存的讀寫只需要1~2個時鐘周期一次L2高速緩存的讀寫也只需要數十個時鐘周期 CPU大多數…

bigpipe提升網站響應速度

2019獨角獸企業重金招聘Python工程師標準>>> 主要思想就是通過異步 發起一次請求&#xff0c;后端不關閉輸出流&#xff0c;多個線程處理各自任務&#xff0c;然后分別發送到客戶端。 https://github.com/4rnold/Demo-Project/tree/master/bigpipe-demohttps://gith…

mysql 添加用戶_mysql創建用戶與授權

一、創建用戶CREATE USER usernamehost IDENTIFIED BY password;說明username&#xff1a;你將創建的用戶名host&#xff1a;指定該用戶在哪個主機上可以登陸&#xff0c;如果是本地用戶可用localhost&#xff0c;如果想讓該用戶可以從任意遠程主機登陸&#xff0c;可以使用通配…