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
中运行内容的基本编程单元; 任务大多时用线程执行任务, 但不一定非得这样做