深入解析C#并行編程:從并行循環到異步編程模式

在當今多核處理器普及的時代,高效利用計算資源成為開發者必備技能。本文將深入剖析C#中的并行編程利器——任務并行庫(TPL)和經典異步模式,助你提升程序性能。

🚀 一、任務并行庫(TPL)核心機制

1. Parallel.For:并行化的for循環

通過簡單改造傳統for循環實現多核并行計算:

Parallel.For(0, 15, i => Console.WriteLine($"The square of {i} is {i*i}"));
  • 執行特點:迭代獨立且無序執行,自動分配線程資源
  • 關鍵參數:
    • fromInclusive:起始索引(包含)
    • toExclusive:結束索引(不包含)
    • Action<int>:迭代邏輯委托

實用場景:矩陣運算、批量圖像處理等CPU密集型任務

2. Parallel.ForEach:集合并行處理器

高效處理IEnumerable集合的并行方案:

string[] words = {"We", "hold", "these", "truths"};
Parallel.ForEach(words, word => Console.WriteLine($"\"{word}\" has {word.Length} letters"));
  • 智能分配:自動分割集合元素到不同線程
  • 注意事項:集合需線程安全,避免共享狀態修改

實戰技巧:數據批處理時優先選擇ForEach,代碼更簡潔


🔄 二、并行循環的三大特性

1. 自動負載均衡

TPL動態監控CPU負載,智能分配迭代任務到不同核心

2. 結果順序保留

即使執行順序隨機,結果數組仍保持原始順序:

int[] squares = new int[50];
Parallel.For(0, 50, i => squares[i] = i * i);
// 結果:[0,1,4,9...2401] 保持索引順序 

3. 異常聚合機制

自動捕獲所有線程異常,拋出AggregateException統一處理


? 三、經典異步編程模式解析

雖然async/await已成主流,但理解傳統模式仍具價值:

委托異步三劍客:

delegate int MyDel(int x);
MyDel del = x => x * x;// 1. 開始異步執行 
IAsyncResult iar = del.BeginInvoke(5, null, null);// 2. 獲取結果 
int result = del.EndInvoke(iar);

三種經典模式對比:

模式實現方式適用場景
等待直到完成EndInvoke阻塞調用簡單異步,需立即結果
輪詢模式循環檢查IsCompleted屬性需中間處理的長時間任務
回調模式AsyncCallback委托通知事件驅動架構,避免主線程阻塞

回調模式示例:

del.BeginInvoke(5, ar => {int res = del.EndInvoke(ar);Console.WriteLine($"Result: {res}");
}, null);

?? 四、新舊異步模式對比

傳統模式痛點:

  • 代碼嵌套復雜(回調地獄)
  • 手動線程管理易出錯
  • 異常處理困難

async/await革命性優勢:

async Task<int> CalculateAsync()
{return await Task.Run(() => 5 * 5);
}
  • 線性代碼結構
  • 自動上下文延續
  • 同步的異常處理機制

💡 五、實戰建議

1. 并行選擇策略:

  • CPU密集型:優先選用Parallel.For/ForEach
  • IO密集型:選擇async/await+Task.Run

2. 避坑指南:

// 錯誤示例:共享變量未保護 
int sum = 0;
Parallel.For(0, 100, i => sum++); // 結果不確定 // 正確方案:使用線程安全操作 
Interlocked.Add(ref sum, 1);

3. 性能優化:

var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount - 1 
};
Parallel.For(0, 1000, options, ...);

🌟 結語

掌握并行編程如同獲得性能加速器:

  • 多核計算首選TPL并行循環
  • 現代項目優先采用async/await
  • 理解傳統模式有助于解決遺留系統問題

性能測試挑戰:嘗試對比Parallel.For與普通for循環在1000萬次計算中的性能差異,評論區分享你的測試結果!👇

異步編程模式對比圖

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

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

相關文章

從零到精通:嵌入式BLE開發實戰指南

目錄 1. BLE的魅力與核心概念:為什么選低功耗藍牙? BLE的核心術語 為什么選擇BLE? 2. 硬件選型:選擇合適的BLE芯片 熱門BLE芯片推薦 選型時的關鍵考量 3. 開發環境搭建:讓你的代碼跑起來 工具準備 安裝步驟 常見問題解決 4. 深入GATT:打造你的BLE服務 服務設計…

15.NFS 服務器

15.NFS 服務器 NFS 服務介紹 NFS是Network File System的縮寫&#xff0c;即網絡文件系統&#xff0c;是一種基于TCP/IP協議的網絡文件共享協議,最早由Sun公司開發&#xff0c;它允許不同操作系統的計算機通過網絡共享文件和目錄&#xff0c;實現跨平臺的文件訪問和管理。 核心…

站在Vue的角度,對比鴻蒙開發中的數據渲染二

第二類數字&#xff08;Number&#xff09;的操作 2.1普通數字的顯示 vue中直接顯示 <template> <div><h3>學習Vue</h3><div>{{ num }}</div> </div></template><script lang"ts" setup>import {ref} fr…

Python自動化測試實戰:reCAPTCHA V3繞過技術深度解析

Python自動化測試實戰&#xff1a;reCAPTCHA V3繞過技術深度解析 摘要 reCAPTCHA V3作為Google推出的無感驗證碼系統&#xff0c;通過先進的機器學習算法分析用戶行為模式&#xff0c;已成為當前最主流的反機器人解決方案。本文將深入解析其核心檢測機制&#xff0c;并提供完…

簡單Modules 的配置與管理,靈活應對多版本軟件環境的需求。

參考文檔 官方手冊&#xff1a;https://modules.readthedocs.io Modulefile 語法&#xff1a;modulefile — Modules documentation Environment Modules 工具 Environment Modules 是一個環境管理工具&#xff0c;用于動態加載、卸載和管理不同版本的軟件環境變量&#xff…

java內部類-匿名內部類

匿名內部類必須有一個已經存在的類或者接口

上篇:《排序算法的奇妙世界:如何讓數據井然有序?》

個人主頁&#xff1a;strive-debug 排序算法精講&#xff1a;從理論到實踐 一、排序概念及應用 1.1 基本概念 **排序**&#xff1a;將一組記錄按照特定關鍵字&#xff08;如數值大小&#xff09;進行遞增或遞減排列的操作。 1.2 常見排序算法分類 - **簡單低效型**&#xff…

2025.8.6 圖論(1)Solution

2025.8.6 圖論&#xff08;1&#xff09;Solution 割點 學習資料&#xff0c;在 csdn 或洛谷上看都行。是模板題題解&#xff08;之一&#xff09;。 T1&#xff1a;Atserckcn與逃離恐怖老師。 題意簡述&#xff1a;從一個圖中選定一個點&#xff0c;使得刪除這個點后圖不連…

OpenBayes 教程上新丨一鍵部署 gpt-oss-20b,實測開源推理模型新 SOTA,性能直逼 o3?mini

時隔 6 年&#xff0c;自 GPT-2 以來&#xff0c;OpenAI 終于再度發布開源大模型——gpt-oss-120b 和 gpt-oss-20b&#xff0c;前者以千億級參數專為復雜推理與知識密集型場景設計&#xff0c;后者則更適合低延遲、本地或專業垂直領域使用&#xff0c;可在消費級硬件&#xff0…

nlp-句法分析

目錄 一、句法概述 1、成分語法理論概述 &#xff08;1&#xff09;分析過程 &#xff08;2&#xff09;缺點 2、依存語法理論概述 &#xff08;1&#xff09;依存關系、配價模式 &#xff08;2&#xff09;分類 &#xff08;3&#xff09;優勢&#xf…

linux磁盤加密

在Linux中&#xff0c;磁盤加密是一種保護數據不被未授權訪問的方法。有多種工具和策略可以實現磁盤加密&#xff0c;包括使用Linux內核的內置功能&#xff0c;如dm-crypt&#xff0c;以及使用更高級的解決方案&#xff0c;如LUKS&#xff08;Linux Unified Key Setup&#xff…

大數據架構演變之路

目錄 一、各階段的架構簡介 二、各個架構的詳細解釋 1. 傳統離線架構 2.1. Lambda架構-離線數倉分析實時鏈路分析 2.2. Lambda架構-離線數倉實時數倉 3. Kappa/流批一體架構 4. 湖倉一體架構 三、總結 一、各階段的架構簡介 技術架構 核心驅動(核心需求) ?關鍵技術 …

STM32 HAL庫驅動0.96寸OLED屏幕

STM32 HAL庫驅動0.96寸OLED屏幕 項目概述 本項目使用STM32 HAL庫為0.96寸OLED屏幕編寫驅動程序。OLED屏幕通過I2C接口與STM32單片機通信&#xff0c;實現文本、數字和圖形的顯示功能。 項目倉庫地址&#xff1a;STM32_Sensor_Drives 硬件連接 OLED屏幕通過I2C接口與STM32連…

橫向越權:修改參數訪問不屬于自己的數據

一、什么是橫向越權定義 橫向越權&#xff08;Horizontal Privilege Escalation&#xff09;是指 同一權限級別的用戶&#xff0c;通過篡改請求參數或資源標識&#xff0c;訪問本不屬于自己的數據或功能。例子 假設一個在線商城&#xff0c;用戶 A 訪問訂單詳情的 URL&#xff…

攻擊實驗(ARP欺騙、MAC洪范、TCP SYN Flood攻擊、DNS欺騙、DHCP餓死)

實驗一 ARP欺騙一、拓撲二、實驗準備、1.設置終端漏洞靶機集合選擇需要的數量和鏡像打開設備上的驅動精靈安裝網卡安裝成功后查看IP地址、網關信息等。三、實驗步驟1.實驗原理中間人&#xff08;攻擊者&#xff09;在終端與網關之間持續發送偽造的 ARP 應答包&#xff0c;雙向欺…

VSCode 禁用更新檢查的方法

通過設置菜單禁用 這是最直接和推薦的方法&#xff0c;可以永久禁用自動更新&#xff1a; 打開 VSCode。點擊左下角的齒輪圖標&#xff0c;然后選擇“設置”。或者通過菜單欄“文件” > “首選項” > “設置”進入。在頂部的搜索框中輸入“update”。找到“Update: Mode”…

Flutter - 應用啟動/路由管理

一、應用入口1. 初始化 Flutter 底層綁定 &#xff0c;運行 App。import package:flutter/material.dart; import package:flutter_base/Application.dart;void main() {// 確保綁定初始化WidgetsFlutterBinding.ensureInitialized();// App初始化Application.init(); }2. 注冊…

MySQL 數據操作全流程:創建、讀取、更新與刪除實戰

MySQL系列 文章目錄MySQL系列前言一、Create(創建)并插入數據1.1 單行數據 全列插入1.2 多行數據 指定列插入1.3 插入沖突時同步更新1.4 沖突時替換二、Retireve讀取數據2.1 全列查詢2.2 查詢指定列2.3 查詢字段為表達式2.4 結果去重 DISTINCT2.5 where條件篩選2.6 order by語…

SQL約束:數據完整性的守護者

在SQL中&#xff0c;約束&#xff08;Constraints&#xff09; 是作用于數據庫表字段上的規則&#xff0c;用于強制保證數據的完整性、準確性和一致性。當插入、更新或刪除數據時&#xff0c;約束會自動驗證操作是否符合規則&#xff0c;若違反則拒絕執行。 以下是SQL中常見的約…

Springboot-vue 地圖展現

在很多社區管理系統中&#xff0c;地圖展示功能是一個重要的模塊&#xff0c;它能直觀地呈現小區的地理位置分布。本文將詳細梳理從前端觸發請求到地圖上展示小區數據的完整流程&#xff0c;幫助大家理解前后端協同工作的具體細節。一、前端觸發&#xff1a;頁面加載與地圖初始…