1.12 多线程和异步编程

1.CPU密集型和IO密集型

2.多线程和异步编程对比

3.Task与Thread对比


1.CPU密集型和IO密集型

csharp 复制代码
1).CPU密集型

CPU的使用率很高(接近100%), 因为任务需要大量的计算; CPU没有时间去休息, 一直在执行

指令
csharp 复制代码
2).IO密集型

任务的总执行时间中, 大部分时间是在等待IO操作完成, 而不是在进行CPU计算

2.多线程和异步编程对比

csharp 复制代码
1).异步编程(Asynchronous Programming)

异步编程是一种编程模式, 它允许程序在等待某些操作(如I/O操作、网络请求等)完成时, 不会

阻塞当前线程; 在C#中, 异步编程通常使用async和await关键字来实现; 异步编程的核心思想

是让程序在等待操作完成时, 可以释放当前线程去处理其他工作, 从而提高程序的响应性和资源

利用率

异步编程主要关注的是避免阻塞, 特别是对于I/O密集型操作; 在异步编程中, 当遇到需要等待

的操作时, 程序会挂起当前方法, 并将控制权返回给调用者, 直到等待的操作完成, 再恢复方法

的执行
csharp 复制代码
异步编程示例(不涉及多线程): 使用async和await进行I/O操作, 如文件读取, 不会阻塞UI线

程, 但读取操作可能由操作系统异步完成, 不需要额外的线程

csharp 复制代码
2).多线程编程(Multithreading Programming)

多线程编程是指使用多个线程来执行程序; 多线程编程通常用于并行处理, 特别是在CPU密集型

操作中, 通过利用多核处理器来同时执行多个任务, 从而提高程序的执行效率

在C#中, 多线程编程可以通过多种方式实现, 如使用Thread类、ThreadPool、Task(基于线

程池)等; 多线程编程关注的是同时执行多个任务, 每个任务在一个独立的线程中运行
csharp 复制代码
多线程编程示例:使用Thread类来创建一个新线程执行任务

csharp 复制代码
3).区别和联系

a.异步编程不一定是多线程

异步操作可以在单个线程中发生; 例如, 在UI应用程序中, 异步操作通常是在主线程(UI线程)

中发起, 然后等待操作完成, 期间不会阻塞UI线程; 但是, 异步操作也可以使用其他线程来执

行; 实际上, 异步编程模型允许在等待操作完成时, 当前线程可以被用来做其他事情, 而等待

的操作可能是在另一个线程中执行, 也可能是在硬件层面(如磁盘I/O)或网络层面进行, 并不

一定需要额外的线程

b.多线程编程不一定是异步的: 多线程编程通常涉及创建和管理多个线程, 这些线程可以同步或

异步地执行任务; 例如, 你可以创建多个线程来执行任务, 然后使用Thread.Join来等待这些

线程完成, 这是同步的多线程编程; 而异步的多线程编程则可能使用回调、事件或Task来在任务

完成时得到通知

c.异步编程和多线程编程可以结合使用: 在C#中, 异步编程模型(async/await)通常与多线

程编程结合, 特别是当使用Task.Run来将工作卸载到线程池时; 这样, 你可以在异步方法中启

动一个后台线程来执行CPU密集型操作, 而不会阻塞调用线程

3.Task与Thread对比

csharp 复制代码
Task是一个Promise(承诺)并不一定必须涉及多线程, 未来某个时间完成任务; 线程是在CPU

中运行内容的基本编程单元; 任务大多时用线程执行任务, 但不一定非得这样做
相关推荐
unicrom_深圳市由你创科技2 小时前
C# 如何实现对象序列化
开发语言·c#
成都易yisdong3 小时前
实现三北方向转换计算器(集成 WMM2025 地磁模型)
开发语言·windows·算法·c#·visual studio
guygg884 小时前
OPC UA Helper: 连接PLC获取变量值
服务器·网络·c#
成都易yisdong6 小时前
基于C#和WMM2025模型的地磁参数计算器实现
开发语言·c#
预见AI6 小时前
C#索引器练习题
开发语言·计算机视觉·c#
~plus~7 小时前
C# 内存管理深度剖析:从 Span<T> 到 Memory<T> 再到 ArrayPool
开发语言·c#
cici158747 小时前
C#与西门子S7-1200通讯实例
开发语言·c#
~plus~7 小时前
C# 异步编程深度剖析:从 async/await 到 ValueTask
开发语言·c#
回忆2012初秋7 小时前
C# 大文件分片上传完整实现指南
开发语言·c#