c# IO密集型與CPU密集型任務詳解,以及在異步編程中的使用示例

文章目錄

  • IO密集型與CPU密集型任務詳解(C#示例)
    • 一、基本概念
      • 1. IO密集型任務
      • 2. CPU密集型任務
    • 二、C#示例
    • 1. IO密集型示例
      • 1.1 文件操作異步示例
      • 1.2 網絡請求異步示例
      • 1.3 數據庫操作異步示例
    • 2. CPU密集型示例
      • 2.1 基本CPU密集型異步處理
      • 2.2 并行處理CPU密集型任務
      • 2.3 進度報告和取消支持
    • 三、處理策略
      • 1. IO密集型任務優化
      • 2. CPU密集型任務優化
      • 混合示例(并行處理CPU密集型任務)
    • 四、總結

IO密集型與CPU密集型任務詳解(C#示例)

一、基本概念

1. IO密集型任務

IO密集型任務(Input/Output Bound)是指執行過程中大部分時間都在等待輸入/輸出操作完成的任務。這些任務的特點是CPU計算量相對較小,主要時間花費在磁盤讀寫、網絡通信、數據庫訪問等IO操作上。

特點:

  • CPU利用率通常較低
  • 性能瓶頸主要在IO設備速度
  • 可通過異步編程或增加IO帶寬來提高性能

2. CPU密集型任務

CPU密集型任務(CPU Bound)是指需要大量計算處理的任務,執行時間主要消耗在CPU計算上,而不是等待IO操作。

特點:

  • CPU利用率高(接近100%)
  • 性能瓶頸主要在CPU處理能力
  • 可通過優化算法或增加CPU核心數來提高性能

二、C#示例

1. IO密集型示例

1.1 文件操作異步示例

using System;
using System.IO;
using System.Threading.Tasks;class Program
{static async Task ProcessFileAsync(){string filePath = "data.txt";try{// 異步寫入文件Console.WriteLine("開始寫入文件...");await File.WriteAllTextAsync(filePath, "這是異步寫入的內容");Console.WriteLine("文件寫入完成");// 異步讀取文件Console.WriteLine("開始讀取文件...");string content = await File.ReadAllTextAsync(filePath);Console.WriteLine($"文件內容: {content}");// 異步追加內容Console.WriteLine("開始追加內容...");await File.AppendAllTextAsync(filePath, "\n這是追加的內容");Console.WriteLine("內容追加完成");}catch (Exception ex){Console.WriteLine($"發生錯誤: {ex.Message}");}}static async Task Main(string[] args){await ProcessFileAsync();}
}

1.2 網絡請求異步示例

using System;
using System.Net.Http;
using System.Threading.Tasks;class Program
{static async Task FetchDataAsync(){using var client = new HttpClient();try{// 異步GET請求Console.WriteLine("開始請求數據...");string response = await client.GetStringAsync("https://api.example.com/data");Console.WriteLine($"獲取數據成功,長度: {response.Length}");// 異步POST請求var content = new StringContent("{\"name\":\"value\"}", System.Text.Encoding.UTF8, "application/json");Console.WriteLine("開始提交數據...");var responseMsg = await client.PostAsync("https://api.example.com/submit", content);Console.WriteLine($"提交數據完成,狀態碼: {responseMsg.StatusCode}");}catch (HttpRequestException ex){Console.WriteLine($"網絡請求錯誤: {ex.Message}");}}static async Task Main(string[] args){await FetchDataAsync();}
}

1.3 數據庫操作異步示例

using System;
using System.Data.SqlClient;
using System.Threading.Tasks;class Program
{static async Task QueryDatabaseAsync(){string connectionString = "Server=.;Database=TestDB;Integrated Security=True;";using var connection = new SqlConnection(connectionString);await connection.OpenAsync();// 異步查詢using var command = new SqlCommand("SELECT * FROM Users WHERE Age > @age", connection);command.Parameters.AddWithValue("@age", 20);Console.WriteLine("開始數據庫查詢...");using var reader = await command.ExecuteReaderAsync();while (await reader.ReadAsync()){Console.WriteLine($"用戶: {reader["Name"]}, 年齡: {reader["Age"]}");}Console.WriteLine("查詢完成");}static async Task Main(string[] args){await QueryDatabaseAsync();}
}

2. CPU密集型示例

2.1 基本CPU密集型異步處理

using System;
using System.Threading.Tasks;class Program
{static int CalculatePrimes(int max){int count = 0;for (int i = 2; i <= max; i++){if (IsPrime(i)) count++;}return count;}static bool IsPrime(int number){if (number <= 1) return false;if (number == 2) return true;if (number % 2 == 0) return false;var boundary = (int)Math.Floor(Math.Sqrt(number));for (int i = 3; i <= boundary; i += 2){if (number % i == 0) return false;}return true;}static async Task Main(string[] args){Console.WriteLine("主線程開始");// 將CPU密集型任務放到后臺線程var primeTask = Task.Run(() => CalculatePrimes(1000000));// 主線程可以繼續做其他工作Console.WriteLine("主線程繼續執行其他工作...");await Task.Delay(500); // 模擬其他工作// 等待計算結果int result = await primeTask;Console.WriteLine($"計算完成,素數數量: {result}");}
}

2.2 并行處理CPU密集型任務

using System;
using System.Linq;
using System.Threading.Tasks;class Program
{static bool IsPrime(int number){// 同上省略...}static async Task<int> ParallelCountPrimesAsync(int max, int partitions){// 分割工作范圍var ranges = Enumerable.Range(0, partitions).Select(i => (start: i * (max / partitions) + 1, end: (i == partitions - 1) ? max : (i + 1) * (max / partitions))).ToList();// 并行執行任務var tasks = ranges.Select(range => Task.Run(() =>{int count = 0;for (int num = range.start; num <= range.end; num++){if (IsPrime(num)) count++;}return count;}));// 等待所有任務完成并匯總結果var results = await Task.WhenAll(tasks);return results.Sum();}static async Task Main(string[] args){Console.WriteLine("開始并行計算...");int result = await ParallelCountPrimesAsync(1000000, 4);Console.WriteLine($"計算完成,素數數量: {result}");}
}

2.3 進度報告和取消支持

using System;
using System.Threading;
using System.Threading.Tasks;class Program
{static async Task LongRunningCpuTaskAsync(IProgress<int> progress, CancellationToken cancellationToken){for (int i = 0; i <= 100; i++){// 檢查是否取消cancellationToken.ThrowIfCancellationRequested();// 模擬CPU密集型工作await Task.Run(() => {// 模擬計算for (int j = 0; j < 1000000; j++){var _ = Math.Sqrt(j);}});// 報告進度progress?.Report(i);}}static async Task Main(string[] args){var progress = new Progress<int>(percent => Console.WriteLine($"進度: {percent}%"));var cts = new CancellationTokenSource();// 設置5秒后取消cts.CancelAfter(5000);try{Console.WriteLine("開始長時間CPU任務...");await LongRunningCpuTaskAsync(progress, cts.Token);Console.WriteLine("任務完成");}catch (OperationCanceledException){Console.WriteLine("任務已取消");}}
}

三、處理策略

1. IO密集型任務優化

  • 使用異步編程模型(async/await)
  • 增加IO帶寬(更快磁盤、網絡)
  • 批量處理減少IO次數
  • 使用緩存減少IO操作

2. CPU密集型任務優化

  • 多線程/并行處理(Parallel類、Task.Run)
  • 優化算法復雜度
  • 使用更高效的庫(如Math.NET Numerics)
  • 使用SIMD指令(Vector)

混合示例(并行處理CPU密集型任務)

using System;
using System.Threading.Tasks;class Program
{static bool IsPrime(int number){// 同上省略...}static async Task Main(string[] args){// 并行計算素數(CPU密集型)int max = 1000000;int segmentSize = max / 4;var tasks = new Task<int>[4];for (int i = 0; i < 4; i++){int start = i * segmentSize + 1;int end = (i == 3) ? max : (i + 1) * segmentSize;tasks[i] = Task.Run(() => {int count = 0;for (int num = start; num <= end; num++){if (IsPrime(num)) count++;}return count;});}await Task.WhenAll(tasks);int totalPrimes = 0;foreach (var task in tasks){totalPrimes += task.Result;}Console.WriteLine($"并行計算100萬以內素數總數: {totalPrimes}");}
}
using System;
using System.IO;
using System.Threading.Tasks;class Program
{static async Task ProcessDataAsync(string inputFile, string outputFile){// IO密集型:異步讀取文件Console.WriteLine("開始讀取文件...");string content = await File.ReadAllTextAsync(inputFile);// CPU密集型:處理數據(轉移到后臺線程)Console.WriteLine("開始處理數據...");string processedContent = await Task.Run(() => ProcessContent(content));// IO密集型:異步寫入結果Console.WriteLine("開始寫入結果...");await File.WriteAllTextAsync(outputFile, processedContent);Console.WriteLine("處理完成");}static string ProcessContent(string content){// 模擬CPU密集型處理var charArray = content.ToCharArray();for (int i = 0; i < charArray.Length; i++){if (i % 2 == 0){charArray[i] = char.ToUpper(charArray[i]);}else{charArray[i] = char.ToLower(charArray[i]);}}return new string(charArray);}static async Task Main(string[] args){await ProcessDataAsync("input.txt", "output.txt");}
}

四、總結

  1. IO密集型:主要時間花費在等待IO操作,應關注IO優化和異步編程
  2. CPU密集型:主要時間花費在計算,應關注算法優化和多核利用
  3. 實際應用:很多任務是混合型的,需要根據瓶頸采取相應策略
  4. C#特性:充分利用async/await、Task、Parallel等特性處理不同類型任務

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

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

相關文章

用lines_gauss的width屬性提取缺陷

自己做了一個圖&#xff0c;這個圖放在資源里了 結果圖是這樣&#xff08;這里只結算了窄區&#xff09; 代碼和備注如下 read_image (Image11, C:/Users/Administrator/Desktop/分享/15/11.png) rgb1_to_gray (Image11, GrayImage) invert_image (GrayImage, ImageInvert) thr…

從0到100:房產中介小程序開發筆記(中)

背景調研 為中介帶來諸多優勢&#xff0c;能借助它打造專屬小程序&#xff0c;方便及時更新核實租賃信息&#xff0c;確保信息準確無誤&#xff0c;像房屋的大致地址、租金數額、租賃條件、房源優缺點等關鍵信息都能清晰呈現。還可上傳房屋拍攝照片&#xff0c;這樣用戶能提前…

【AI 時代的網絡爬蟲新形態與防護思路研究】

網絡爬蟲原理與攻擊防護的深度研究報告 網絡爬蟲技術已進入AI驅動的4.0時代&#xff0c;全球自動化請求流量占比突破51%&#xff0c;傳統防御手段在面對高度仿真的AI爬蟲時已顯疲態。基于2025年最新數據&#xff0c;深入剖析網絡爬蟲的基本原理、工作流程、分類與攻擊方式&…

低代碼平臺架構設計與關鍵組件

低代碼平臺的架構設計是其核心能力的關鍵支撐&#xff0c;需要平衡可視化開發的便捷性、生成應用的健壯性與性能、可擴展性以及企業級需求&#xff08;如安全、多租戶、集成&#xff09;。以下是一個典型的企業級低代碼平臺架構概覽及其關鍵組件&#xff1a; https://example.…

電商 ERP 系統集成接口指南

電商 ERP 系統的高效運行依賴于與多個業務系統的無縫對接&#xff0c;需要集成的核心接口包括&#xff1a;商品管理、訂單處理、庫存同步、物流配送、客戶管理、財務結算等。這些接口是實現數據互通、業務協同的關鍵橋梁。 一、電商 ERP 系統集成所需接口類型 &#xff08;一…

Python實現對WPS協作群進行群消息自動推送

前言 本文是該專欄的第59篇,后面會持續分享python的各種干貨知識,值得關注。 相信有些同學在工作或者項目中,都會使用到“WPS協作”作為辦公聊天軟件。如果說,有些項目的監控預警正好需要你同步到WPS協作群,這個時候需要怎么去做呢? 而本文,筆者將基于WPS協作,通過Py…

js嚴格模式和非嚴格模式

好的&#xff0c;這是一個非常基礎且重要的概念。我們來詳細解析一下 JavaScript 中的嚴格模式&#xff08;Strict Mode&#xff09;和非嚴格模式&#xff08;Sloppy Mode&#xff09;。 可以把它想象成參加一場考試&#xff1a; 非嚴格模式&#xff1a;就像是開卷、不計時的…

板凳-------Mysql cookbook學習 (十一--------1)

第11章&#xff1a;生成和使用序列 11.0 引言 11.1 創建一個序列列并生成序列值 CREATE TABLE insect ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, PRIMARY KEY (id)&#xff0c;name VARCHAR(30) NOT NULL,date DATE NOT NULL,origin VARCHAR(30) NOT NULL); 字段說明 ?id…

Vue3 中 Excel 導出的性能優化與實戰指南

文章目錄 Vue3 中 Excel 導出的性能優化與實戰指南引言&#xff1a;為什么你的導出功能會卡死瀏覽器&#xff1f;一、前端導出方案深度剖析1.1 xlsx (SheetJS) - 輕量級冠軍1.2 exceljs - 功能強大的重量級選手 二、后端導出方案&#xff1a;大數據處理的救星2.1 為什么大數據需…

安卓RecyclerView實現3D滑動輪播效果全流程實戰

安卓RecyclerView實現3D滑動輪播效果全流程實戰 1. 前言 作為一名學習安卓的人,在接觸之前和之后兩種完全不同的想法: 好看和怎么實現 當初接觸到RecyclerView就覺得這個控件就可以把關于列表的所有UI實現,即便不能,也是功能十分強大 放在現在依然是應用最廣的滑動列表控…

電機控制——電機位置傳感器零位標定

在有感FOC算法中電機位置是一個重要的輸入&#xff0c;電機位置傳感器的作用就是測量電機的旋轉角度&#xff0c;通常是輸出sin(Theta)和cos(Theta)兩路模擬信號&#xff0c;根據這兩路模擬信號測得電機旋轉絕對角度。注意傳感器測量的是機械角度&#xff0c;不是電角度。 關于…

生物化學(實驗流程) PCR聚合酶鏈式反應: DNA 凝膠電泳實驗原理 實驗流程方法 實操建議筆記

凝膠電泳是分子生物學中最常用的技術之一&#xff0c;廣泛用于 DNA 片段的可視化、分離與識別。在獲取DNA 凝膠電泳相關設備&#xff08;電泳設備 & DNA樣品染料 & 凝膠 & 染料&#xff09;之后&#xff0c;可以考慮進行電泳操作。 整體電泳操作流程&#xff08;從…

Python應用指南:利用高德地圖API獲取公交+地鐵可達圈(三)

副標題&#xff1a;基于模型構建器的批處理多份CSV轉換為點、線、面圖層 在地理信息系統&#xff08;GIS&#xff09;的實際應用中&#xff0c;我們經常需要處理大量以表格形式存儲的數據&#xff0c;例如人口統計數據、興趣點&#xff08;POI&#xff09;信息和監測站點記錄等…

每日算法刷題Day38 6.25:leetcode前綴和3道題,用時1h40min

5. 1749.任意子數組和的絕對值的最大值(中等,學習) 1749. 任意子數組和的絕對值的最大值 - 力扣&#xff08;LeetCode&#xff09; 思想 1.給你一個整數數組 nums 。一個子數組 [numsl, numsl1, ..., numsr-1, numsr] 的 和的絕對值 為 abs(numsl numsl1 ... numsr-1 nu…

創客匠人視角下創始人 IP 打造的底層邏輯與實踐路徑

在知識付費行業蓬勃發展的當下&#xff0c;創始人 IP 已成為連接用戶與商業價值的核心紐帶。創客匠人創始人老蔣在與行業頭部 IP 洪鑫的對話中揭示了一個關鍵命題&#xff1a;IP 打造的成敗&#xff0c;始于發心與理念的根基。從洪鑫教育中心營收超 6000 萬的案例來看&#xff…

2022/7 N2 jlpt詞匯

気力&#xff08;きりょく&#xff09; 清く&#xff08;きよく&#xff09; 記録&#xff08;きろく&#xff09; 記憶&#xff08;きおく&#xff09; 賢い&#xff08;かしこい&#xff09; 偉い&#xff08;えらい&#xff09; 凄い&#xff08;すごい&#xff09; 鋭い&am…

系統性能優化-8 TCP緩沖區與擁塞控制

每個 TCP 連接都有發送緩沖區和接收緩沖區&#xff0c;發送緩沖區存已發送未確認數據和待發送數據&#xff0c;接收緩沖區存接收但是沒有被上層服務讀取的數據。 # cat /proc/net/sockstat sockets: used 1885 TCP: inuse 537 orphan 0 tw 3 alloc 959 mem 10其中 mem 代表當前…

【前端】vue工程環境配置

環境準備(Windows版本) nodejs安裝 (base) PS C:\Users\Administrator> nvm install 18.8.0 (base) PS C:\Users\Administrator> nvm use 18.8.0 Now using node v18.8.0 (64-bit) (base) PS C:\Users\Administrator> npm -v 8.18.0 (base) PS C:\Users\Administrat…

什么是data version control?為什么需要它?它能解決什么問題?

Data Version Control (DVC) 是一個開源工具&#xff0c;專為數據科學和機器學習項目設計。它的核心目標是像 Git 管理代碼一樣來管理機器學習項目中的數據和模型文件。 簡單來說&#xff0c;DVC 是什么&#xff1f; Git for Data & Models&#xff1a; 它擴展了 Git 的功…

簡約計生用品商城簡介

計生用品商城簡介&#xff1a;uniapp結合thinkphp實現的全開源代碼&#xff0c; 內置基本功能&#xff1a;1.后臺商品excel一鍵導入 2.分銷利潤&#xff0c;按照利潤加個分紅