System.Threading.Tasks 庫簡介

System.Threading.Tasks?是 .NET 中任務并行庫(Task Parallel Library, TPL)的核心組件,它提供了基于任務的異步編程模型,是現代 .NET 并發編程的基礎。

設計原理

1. 核心目標

  • 抽象并發工作:將并發操作抽象為"任務"概念

  • 資源高效利用:自動管理線程池資源

  • 組合性:支持任務鏈式操作和組合

  • 取消支持:內置取消操作機制

  • 狀態跟蹤:提供任務生命周期管理

2. 關鍵組件

  • Task/Task<T>:表示異步操作的核心類

  • TaskScheduler:控制任務如何、何時被執行

  • TaskFactory:提供創建和啟動任務的便捷方法

  • CancellationToken:任務取消機制

  • TaskCompletionSource:手動控制任務生命周期

3. 架構層次

  1. 用戶層:開發者直接使用的Task API

  2. 調度層:TaskScheduler管理任務執行

  3. 線程池層:實際執行工作的底層線程池

典型用法示例

示例1:基礎異步任務

// 創建并運行簡單任務
Task.Run(() => 
{Console.WriteLine("任務在后臺線程執行");Thread.Sleep(1000); // 模擬工作Console.WriteLine("任務完成");
});// 帶返回值的任務
Task<int> calculateTask = Task.Run(() => 
{Thread.Sleep(500);return 42; // 計算結果
});// 等待任務完成并獲取結果
int result = await calculateTask;
Console.WriteLine($"計算結果: {result}");

應用場景:CPU密集型后臺計算,不阻塞UI線程。

示例2:任務組合與延續

// 創建三個任務
Task<string> task1 = Task.Run(() => "Hello");
Task<string> task2 = Task.Run(() => "World");
Task<int> task3 = Task.Run(() => 2023);// 等待所有任務完成
await Task.WhenAll(task1, task2, task3);// 使用結果組合輸出
Console.WriteLine($"{task1.Result} {task2.Result} {task3.Result}");// 任務延續
Task continuation = task1.ContinueWith(t => 
{Console.WriteLine($"前一個任務的結果: {t.Result}");
}, TaskContinuationOptions.OnlyOnRanToCompletion);

應用場景:并行執行多個獨立操作,然后合并結果或執行后續操作。

示例3:高級任務控制

// 使用TaskCompletionSource手動控制任務
var tcs = new TaskCompletionSource<string>();// 模擬異步回調
Timer timer = new Timer(_ => 
{try{// 模擬工作string result = DateTime.Now.ToString();tcs.SetResult(result); // 手動完成任務}catch (Exception ex){tcs.SetException(ex); // 手動設置異常}
}, null, 1000, Timeout.Infinite);// 等待任務完成
try
{string timeString = await tcs.Task;Console.WriteLine($"當前時間: {timeString}");
}
catch (Exception ex)
{Console.WriteLine($"任務失敗: {ex.Message}");
}

應用場景:將基于回調的異步API轉換為基于任務的異步模式(TAP)。

示例4:取消任務

var cts = new CancellationTokenSource();
CancellationToken token = cts.Token;// 創建可取消的任務
Task longRunningTask = Task.Run(() => 
{for (int i = 0; i < 100; i++){token.ThrowIfCancellationRequested(); // 檢查取消請求Thread.Sleep(100); // 模擬工作Console.WriteLine($"進度: {i}%");}
}, token);// 3秒后取消任務
cts.CancelAfter(3000);try
{await longRunningTask;
}
catch (OperationCanceledException)
{Console.WriteLine("任務被取消");
}

應用場景:長時間運行的操作需要提供取消功能。

核心概念深入

1. 任務狀態機

任務有以下幾種狀態:

  • Created:已創建但未調度

  • WaitingForActivation:等待激活

  • WaitingToRun:已調度但未開始執行

  • Running:正在執行

  • WaitingForChildrenToComplete:等待子任務完成

  • RanToCompletion:成功完成

  • Canceled:被取消

  • Faulted:因異常失敗

2. 任務調度策略

  • 線程池調度器:默認調度器,使用線程池線程

  • 同步上下文調度器:在特定同步上下文(如UI線程)執行

  • 自定義調度器:可繼承TaskScheduler實現特殊調度邏輯

3. 異常處理

任務中的異常會被捕獲并存儲在?Task.Exception?屬性中,當等待任務或訪問Result屬性時,這些異常會被重新拋出。

Task faultyTask = Task.Run(() => throw new InvalidOperationException("出錯了"));try
{await faultyTask;
}
catch (InvalidOperationException ex)
{Console.WriteLine($"捕獲到異常: {ex.Message}");
}

最佳實踐

  1. 避免Task.Wait和Task.Result:可能導致死鎖,優先使用await

  2. 合理使用ConfigureAwait:庫代碼應使用ConfigureAwait(false)

  3. 注意任務生命周期:長時間運行的任務應考慮取消支持

  4. 避免過度并行化:太多并行任務會導致線程池饑餓

  5. 正確處理異常:確保所有任務異常都被處理

性能考慮

  • 任務創建開銷:輕量級但非零成本,高頻場景考慮對象池

  • 線程池壓力:大量短任務可能導致線程池頻繁調整

  • 同步上下文:不必要地回到原始上下文會影響性能

System.Threading.Tasks?提供了強大而靈活的并發編程模型,是現代 .NET 應用程序中處理異步和并行操作的首選方式。

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

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

相關文章

Python爬蟲實戰:研究jieba相關技術

1. 引言 1.1 研究背景與意義 隨著互聯網技術的飛速發展,網絡新聞已成為人們獲取信息的主要渠道之一。每天產生的新聞文本數據量呈爆炸式增長,如何從海量文本中高效提取有價值的信息,成為信息科學領域的重要研究課題。文本分析技術通過對文本內容的結構化處理和語義挖掘,能…

github 淘金技巧

1. 效率&#xff0c;搜索&#xff0c;先不管。后面再說。 2. 分享的話&#xff0c; 其實使用默認的分享功能也行。也是后面再說。此 app &#xff0c; 今天先做到這里。 下面我們再聊點其他東西。其實我還想問&#xff0c;這個事情&#xff0c;其他人是否也做了&#xff0c; ht…

RAG技術發展綜述

摘要 檢索增強生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;技術已成為大語言模型應用的核心技術棧。RAG有效解決了LLM的幻覺問題、知識截止和實時更新挑戰&#xff0c;目前正處于全面產業化階段。本文系統性地分析RAG的全棧技術架構&#xff0c;包括檢索…

集群聊天服務器---muduo庫(3)

使用muduo網絡庫進行編譯和鏈接的示例 項目的目錄結構 bin: 存放可執行文件。 lib: 存放庫文件。 include: 存放頭文件。 src: 存放源代碼文件。 build: 存放編譯生成的中間文件。 example: 存放示例代碼。 thirdparty: 存放第三方庫。 CMakeLists.txt: CMake構建系統…

雙核SOC/5340 應用和網絡核間通訊

1&#xff1a; 可以在 nRF Connect SDK 文件夾結構的 samples/ipc/ipc_service 下找到示例&#xff0c;應用和網絡核心在由 CONFIG_APP_IPC_SERVICE_SEND_INTERVAL 選項指定的時隙內相互發送數據。可以更改該值并觀察每個核心的吞吐量如何變化 nRF5340 DK 可以使用 RPMsg 或 IC…

Spring Cloud Ribbon核心負載均衡算法詳解

Ribbon 作為 Spring Cloud 生態中的客戶端負載均衡工具&#xff0c;提供多種動態負載均衡算法&#xff0c;根據后端服務狀態智能分配請求。其核心算法及適用場景如下&#xff1a; &#x1f9e0; 一、Ribbon 負載均衡算法 算法名稱工作原理引用來源輪詢 (RoundRobinRule)按服務…

網站圖片過于太大影響整體加載響應速度怎么辦? Typecho高級圖像處理插件

文章目錄 LeleImges - Typecho高級圖像處理插件 ???插件介紹 ??插件架構 ???主要功能 ?性能優勢 ??系統要求 ??安裝方法 ??詳細配置說明 ??圖片質量設置 ???最大寬度/高度限制 ??壓縮格式選擇 ???壓縮方法選擇 ??GIF處理方式 ???備份源文件 ??…

VUE3入門很簡單(1)--- 響應式對象

前言 重要提示&#xff1a;文章只適合初學者&#xff0c;不適合專家&#xff01;&#xff01;&#xff01; 什么是響應式對象&#xff1f; 在Vue3中&#xff0c;響應式對象就是這種智能溫控器。當你修改JavaScript對象的數據時&#xff0c;Vue會自動更新網頁上顯示的內容&am…

廣州華銳互動攜手中石油:AR 巡檢系統實現重大突破?

廣州華銳互動在 AR 技術領域的卓越成就&#xff0c;通過一系列與知名企業、機構的成功合作案例得以充分彰顯。其中&#xff0c;與中石油的合作項目堪稱經典&#xff0c;展現了廣州華銳互動運用 AR 技術解決實際難題、達成目標的強大實力。? 中石油作為能源行業的巨擘&#xff…

權威認證!華宇TAS應用中間件榮獲CCRC“中間件產品安全認證”

近日&#xff0c;華宇TAS應用中間件順利通過了中國網絡安全審查認證和市場監管大數據中心(CCRC)的信息安全認證&#xff0c;獲得了IT產品信息安全認證證書。此次獲證&#xff0c;標志著華宇TAS應用中間件在安全性、可靠性及合規性等方面達到行業領先水平&#xff0c;可以為政企…

BI財務分析 – 反映盈利水平利潤占比的指標如何分析(下)

之前的文章重點把構成銷售凈利率、主營業務利潤率、成本費用利潤率、營業利潤率、銷售毛利率的分母像銷售收入、營業收入、主營業務收入凈額、成本費用總額做了比較細致的說明&#xff0c;把這幾個基本的概念搞明白后&#xff0c;再來看這幾個指標就比較容易理解了。 銷售凈利…

竹云受邀出席華為開發者大會,與華為聯合發布海外政務數字化解決方案

6月20日-22日&#xff0c;華為開發者大會&#xff08;HDC 2025&#xff09;在東莞松山湖盛大召開。作為華為一年一度面向全球開發者的頂級科技盛會&#xff0c;今年的HDC不僅帶來了HarmonyOS 6.0 Beta版本、盤古大模型5.5等多項重磅技術和產品更新&#xff0c;更聚集了全球極客…

AI助力游戲設計——從靈感到行動-靠岸篇

OK&#xff0c;朋友&#xff0c;如果你到了這里&#xff0c;那就證明這趟旅程&#xff0c;快要到岸了。 首先&#xff0c;恭喜你&#xff0c;到了需要這一步的時候。其實&#xff0c;如果你有一天真的用到了&#xff0c;希望你可以回來打個卡。行了&#xff0c;不廢話&#xf…

vue將頁面導出pdf,vue導出pdf ,使用html2canvas和jspdf組件

vue導出pdf 需求&#xff1a;需要前端下載把當前html下載成pdf文件–有十八頁超長&#xff0c;之前使用vue-html2pdf組件&#xff0c;但是這個組件有長度限制和比較新瀏覽器版本限制&#xff0c;所以改成使用html2canvas和jspdf組件 方法&#xff1a; 1、第一步&#xff1a;我…

024 企業客戶管理系統技術解析:基于 Spring Boot 的全流程管理平臺

企業客戶管理系統技術解析&#xff1a;基于Spring Boot的全流程管理平臺 在企業數字化轉型的浪潮中&#xff0c;高效的客戶管理系統成為提升企業競爭力的關鍵工具。本文將深入解析基于Java和Spring Boot框架構建的企業客戶管理系統&#xff0c;該系統涵蓋員工管理、客戶信息管…

JavaScript性能優化代碼示例

JavaScript性能優化實戰大綱 性能優化的核心目標 減少加載時間、提升渲染效率、降低內存占用、優化交互響應 代碼層面的優化實踐 避免全局變量污染&#xff0c;使用局部變量和模塊化開發 減少DOM操作頻率&#xff0c;批量處理DOM更新 使用事件委托替代大量事件監聽器 優化循…

樹的重心(雙dfs,換根)

思路&#xff1a; 基于樹形 DP 的兩次遍歷&#xff08;第一次dfs計算以某個初始根&#xff08;這里選了 1&#xff09;為根時各子樹的深度和與節點數&#xff0c;第二次zy進行換根操作&#xff0c;更新每個節點作為根時的深度和&#xff09; 換根原理&#xff1a; 更換主根&…

官方App Store,直鏈下載macOS ,無需Apple ID,macOS10.10以上.

前言 想必很多人都有過維修老舊Mac的體驗,也有過想要重裝macos的體驗. 尤其是前者,想要重裝或者升級系統,由于官方已經無法更新,必須下載iSo鏡像 這時就會遇到死循環:想要更新macOS ,必須先使用更高版本的App Store,但要使用更高版本的App Store,必須先更新macOS !!! 如果想…

芋道生成前端界面代碼詳解

一、搜索框 1、整體架構 <ContentWrap> ... </ContentWrap><ContentWrap> 是頁面布局容器&#xff08;可能是自定義組件&#xff09;&#xff0c;包裹住頁面的內容區域。 2、el-form 表單&#xff08;搜索區域&#xff09; 2.1參數 <el-formclass&quo…

小程序入門:推廣技巧與運行數據查看解析

在當今數字化時代&#xff0c;小程序的應用愈發廣泛&#xff0c;無論是企業還是個人開發者&#xff0c;都希望自己的小程序能夠獲得更多用戶關注并順利運行。本文將詳細介紹小程序發布的流程、推廣策略以及如何查看運行數據&#xff0c;助力開發者更好地運營小程序。 一、小程…