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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;按照利润加个分红