当前位置: 首页 > article >正文

【C#】异步和多线程

异步多线程是两个相关但不同的概念,它们都可以提高程序的效率和响应能力,但实现方式和适用场景有所不同。

区别

  1. 异步(Asynchronous):

    • 异步是一种编程方式,指的是代码在等待一个耗时操作完成时,不会阻塞当前线程,而是继续执行后面的代码。异步操作通常会让主线程空闲,以执行其他任务,而不是等待当前任务完成。
    • 异步并不总是创建新线程,很多异步操作会复用当前线程或依赖系统资源(如 I/O 操作)来完成。
  2. 多线程(Multithreading):

    • 多线程是一种并行执行任务的技术,即在程序中创建多个线程,每个线程可以独立执行不同的任务。
    • 多线程并不总是异步的。如果多个线程同时执行同步任务,也会导致阻塞。
    • 多线程会占用更多的系统资源,适用于CPU密集型任务,如复杂计算和处理。

举例说明

异步示例:文件下载

假设正在下载一个大文件,在异步方式中,文件下载操作会异步启动,主线程可以继续执行其他任务,比如更新UI或响应用户操作。

public async Task DownloadFileAsync()
{
    Console.WriteLine("开始下载...");
    await Task.Delay(5000); // 模拟下载耗时操作
    Console.WriteLine("下载完成");
}

public async Task MainAsync()
{
    Console.WriteLine("任务开始");
    await DownloadFileAsync(); // 异步下载文件
    Console.WriteLine("任务结束");
}

asyncawait 的运行流程
当执行到 await 时,如果操作还没完成,程序会返回调用者,并继续执行主线程上的其他操作。
一旦异步任务完成,程序会回到 await 后的位置,继续执行后续代码。

输出示例

任务开始
开始下载...
(等待5秒)
下载完成
任务结束

在异步操作期间,主线程不会被阻塞,可以执行其他任务。Task.Delay 只是一个模拟方法,用来表示文件下载期间的等待时间。即使在主线程上,await 也不会阻塞,它会让主线程继续执行其他代码。

多线程示例:并行计算

假设有多个复杂的数学计算任务,可以使用多线程来并行处理这些任务,每个线程负责计算一个任务。

public void Calculate()
{
    Console.WriteLine($"线程 {Thread.CurrentThread.ManagedThreadId} 正在计算...");
    Thread.Sleep(3000); // 模拟计算耗时
    Console.WriteLine($"线程 {Thread.CurrentThread.ManagedThreadId} 计算完成");
}

public void RunMultiThreading()
{
    Console.WriteLine("开始多线程计算");

    // 启动多个线程并行执行
    Task task1 = Task.Run(Calculate);
    Task task2 = Task.Run(Calculate);

    Task.WaitAll(task1, task2); // 等待所有线程完成
    Console.WriteLine("多线程计算结束");
}

输出示例

开始多线程计算
线程 5 正在计算...
线程 6 正在计算...
(等待3秒)
线程 5 计算完成
线程 6 计算完成
多线程计算结束

在此示例中,Calculate 方法在多个线程上并行执行,Thread.Sleep 模拟耗时操作。每个任务独立运行,并且可以利用多核CPU的性能。

小结

  • 异步:是一种编程方式,让耗时操作不阻塞主线程,通常适用于 I/O 密集型任务(文件、网络等),不一定会创建新线程。
  • 多线程:是一种并行技术,适用于 CPU 密集型任务(复杂计算),可以加速任务的执行。

http://www.kler.cn/a/376076.html

相关文章:

  • ​Java面试经典 150 题.P13. 罗马数字转整数(012)​
  • UE Mutiplayer(1):网络概述
  • vue2开发 对接后端(go语言)常抛异常情况以及处理方法汇总
  • 【AIGC】逆向拆解OpenAI官方提示词Prompt技巧:高效提升ChatGPT输出质量
  • vxe-table v4.8+ 与 v3.10+ 虚拟滚动支持动态行高,虚拟渲染更快了
  • Redis高频面试题
  • 速度!双击文件就可以运行本地大模型!神奇的AI大模型开源项目——llamafile
  • Redis中储存含LocalDateTime属性对象的序列化实现
  • R数据结构向量基础
  • 公有云开发基础教程
  • 汽车固态电池深度报告
  • 4K双模显示器值得买吗?
  • Python WordCloud库与jieba分词生成词云图的完整指南
  • Ollama:本地部署与运行大型语言模型的高效工具
  • 在kanzi 3.9.8里使用API创建自定义材质
  • PHP反序列化原生类字符串逃逸框架反序列化利用
  • 奥数与C++小学四年级(第十七题 弹跳板)
  • blender雕刻基础 笔记
  • Python毕业设计选题:基于django+vue的宠物寄养平台的设计与实现
  • element根据输入,动态生成表格
  • 【MySQL】MySQL安装以及各种报错处理
  • 全国高校计算机能力挑战赛 Python
  • 【Linux系统编程】第三十九弹---探索信号处理的奥秘:阻塞信号与sigset_t的深入剖析及实战
  • springboot河南旅游推荐系统-计算机毕业设计源码33358
  • 将机器人六轴坐标转为4*4矩阵(Opencv/C++)
  • PHP决策多功能投票小程序系统源码