参考:

.NET进阶篇06-async异步、thread多线程3 - 知乎 (zhihu.com)

C# Async/Await: 让你的程序变身时间管理大师_哔哩哔哩_bilibili

C# 异步编程基础(完结)_哔哩哔哩_bilibili

Demo:

https://files.cnblogs.com/files/summerZoo/Async_Sync_Parall.zip?t=1647483780

https://files.cnblogs.com/files/summerZoo/AsyncAwait.zip?t=1647483856

异步——一个cpu在执行某个线程,遇到等待(比如I/O场景,等待数据库返回数据),它可以去执行其他任务,若当前等待结束,再由它或其他cpu执行核心去继续执行

理解:妈妈现在需要做饭,她将饭洗好放到电饭锅,按下煮饭键。然后她就去炒菜了,而不用等着米饭煮好了再去炒菜(同步),这就是异步。

异步不一定能提高单项工作的效率(米饭还是要煮半个小时、炒菜还是需要花费10分钟),但是可以提升应用程序的处理效率(在一定时间范围内做更多工作)。比如妈妈是一台服务器,半小时内她就处理了煮饭、炒菜两项请求。

应用场景:IO密集型(1、跟第三方交互的(非托管资源,经常有async版本)2.数据库openAsync-Redis交互 3.Web请求-Api 4.文件读取)

并发——创建多个线程,同一时间他们都能竞争cpu执行的时间片。

理解:现在需要做饭,需要切菜(线程一)、生火(线程二)、煮饭(线程三)这三个前期准备工作可以同时进行,为了提升效率,妈妈让儿子、丈夫、自己三个人(多个cpu执行核心)去做这三件事。这就是并发执行。但是计算器。

应用场景:CPU计算密集型(计算耗时操作)

常用异步操作:异步IO

现在,让我们假定要实现一个Wb应用程序,每个客户端请求抵达服务器时,都需要发出一个数据库请求。一个客户端请求抵达时一个线程池线程会调用你的代码。如果现在以同步方式发出一个数据库请求,线程会阻塞不确定的时间,等待数据库返回一个结果。在此期间,如果另一个客户端请求抵达,线程池会创建另一个线程,这个线程在发出另一个数据库请求后,同样会阻塞。随着越来越多的客户端请求抵达,创建的线程也越来越多,所有这些线程都阻塞并等待数据库的响应。结果是Wb服务器分配大量根本不会使用的系统资源(线程及其内存)!更糟的是,数据库真的会用各种结果来响应这些请求。线程被解锁,全都开始执行。但是,由于可能运行了大量线程,同时CPU内核只有区区几个,所以Windows被迫执行频繁的上下文切换,这进一步损害了性能。这和实现一个可伸缩应用程序的初衷是完全背道而驰的。

异步IO

Task异步

async/await

1、在采用 await AyncMethod调用异步方法AyncMethod时,主线程释放返回线程池,线程池拿到一个空闲的可执行的线程执行AyncMethod内的内容,这个空闲的线程有可能是主线程.

2、在await AyncMethod执行完成后,线程池拿到一个空闲的可执行的线程B执行AyncMethod后的内容

AyncMethod是一个耗时比较短的操作,B线程大概率会是执行AyncMethod的线程,这和clr的就近优化调度有关;

比如服务员会在客人点餐完成后上茶水,服务员A(线程1)给了顾客甲一个菜单让顾客点菜(模拟一个异步操作),然后准备去忙其他事情(释放当前线程),没想到没走两步,顾客甲说点好了(耗时短的操作),那么很大可能还是服务员A给顾客上茶水,这样最高效。

AyncMethod是一个耗时比较长的操作,B线程大概率会是线程池随机的一个空闲线程;

同样是点菜的例子,如果服务员把菜单给顾客甲之后,顾客甲说等朋友到了再点菜(耗时长的操作),半小时后朋友才来点好。这个时候肯定是老板随机让当前空闲的一个服务员去上茶水

C# 线程(四)——异步的更多相关文章

  1. C#中的线程四(System.Threading.Thread)

    C#中的线程四(System.Threading.Thread) 1.最简单的多线程调用 System.Threading.Thread类构造方法接受一个ThreadStart委托,改委托不带参数,无 ...

  2. 线程池 异步I/O线程 <第三篇>

    在学习异步之前先来说说异步的好处,例如对于不需要CPU参数的输入输出操作,可以将实际的处理步骤分为以下三步: 启动处理: 实际的处理,此时不需要CPU参数: 任务完成后的处理: 以上步骤如果仅仅使用一 ...

  3. 转载 线程池 异步I/O线程 <第三篇>

    在学习异步之前先来说说异步的好处,例如对于不需要CPU参数的输入输出操作,可以将实际的处理步骤分为以下三步: 启动处理: 实际的处理,此时不需要CPU参数: 任务完成后的处理: 以上步骤如果仅仅使用一 ...

  4. 【转载】Javascript里面的线程和异步

    JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序. 参考这篇文章 http://www.ruanyifeng.com/blog/2012/1 ...

  5. BeginInvoke 方法真的是新开一个线程进行异步调用吗?

    转自原文BeginInvoke 方法真的是新开一个线程进行异步调用吗? BeginInvoke 方法真的是新开一个线程进行异步调用吗? 参考以下代码: public delegate void tre ...

  6. python线程实现异步任务

    了解异步编程 楼主在工作中遇到了以下问题,开发接口爬取数据代码完成之后要写入redis缓存,但是在写入缓存的过程花费2-3s,进行这样就大大影响了接口的性能,于是想到了使用异步存储. 传统的同步编程是 ...

  7. java future模式 所线程实现异步调用(转载

    java future模式 所线程实现异步调用(转载) 在多线程交互的中2,经常有一个线程需要得到另个一线程的计算结果,我们常用的是Future异步模式来加以解决.Future顾名思意,有点像期货市场 ...

  8. Android线程之异步消息处理机制(三)——AsyncTask

    Android的异步消息处理机制能够很完美的解决了在子线程中进行UI操作的问题,但是为了更加方便我们在子线程中对UI进行操作,Android还提供了另一个很好用的工具,AsyncTask就是其中之一. ...

  9. Android线程之异步消息处理机制(二)——Message、Handler、MessageQueue和Looper

    异步消息处理机制解析 Android中的异步消息处理主要有四个部分组成,Message.Handler.MessageQueue和Looper. 1.Message Message是在线程之间传递的消 ...

  10. Java ExecutorServic线程池(异步)

    相信大家都在项目中遇到过这样的情况,前台需要快速的显示,后台还需要做一个很大的逻辑.比如:前台点击数据导入按钮,按钮后的服务端执行逻辑A,和逻辑B(执行大量的表数据之间的copy功能),而这时前台不能 ...

随机推荐

  1. 服务器通用背板管理(UBM)实现

    本文分享自天翼云开发者社区<服务器通用背板管理(UBM)实现>,作者: 乘风 一 UBM概述 通过SGPIO 进行 SAS 和 SATA 背板管理的 SCSI 机箱服务 (SES) 标准于 ...

  2. waterdrop同步mysql数据到hive

    一.shell类型任务,提交到yarn集群 #!bin/bash#=========================数据源配置,只读账号=========================jdbc_ur ...

  3. Luogu P11543 Code+#5 我有矩阵,你有吗? 题解 [ 绿 ] [ 扩展域并查集 ]

    我有矩阵,你有吗?:并查集小清新题. 思路 看到这题,我第一个想到的竟然是高斯消元. 首先一行和一列肯定不会操作两次以上,不然一定可以等效为操作 \(0\) 次和操作 \(1\) 次的情况. 于是我们 ...

  4. 超详细的 Linux - conda 环境安装教程

    一.引言 在 Linux 系统中安装 conda 环境可以为您提供便捷的 Python 环境管理和包管理功能.本教程将详细介绍在 Linux 系统中安装 conda 的步骤. 二.安装前的准备 确保您 ...

  5. win7系统清理C盘空间方法实测

    问题描述:win7电脑C盘容易满,采用如下方法清理 方法一:win+r,输入%temp%查看临时文件,手动删除不需要的文件 方法二:减小休眠文件:如果你很少使用休眠模式,可以通过win+r输入cmd命 ...

  6. 百万架构师第四十六课:并发编程的原理(一)|JavaGuide

    百万架构师系列文章阅读体验感更佳 原文链接:https://javaguide.net 并发编程的原理 课程目标 JMM 内存模型 JMM 如何解决原子性.可见性.有序性的问题 Synchronize ...

  7. 【小鼓捣】手搓Verilog-CPU测试全流程自动化

    自动化流程思路 1.C++/Python:生成大量包含指定指令的mips程序(A.asm) 2.命令行:导出该mips程序指令的机器码(A.txt) 3.魔改MARS:产生测试所需的IM.DM存入信息 ...

  8. Font-awesome失效恢复

    Font-awesome失效恢复策略 可能的原因有: 1.用了收费pro的版本,没充钱. Font Awesome 6 字体分为 Free 和 Pro 两个版本.Font Awesome 6 Free ...

  9. Peach-Printer2.0 Web 打印服务解决方案

    Peach-Printer1.0在沉寂许久后迎来了一个使用客户,非常感谢客户的支持和理解. 通过客户的使用反馈本人尝试对1.0版本进行完善修改,但始终打印效果未能实现预期.思索许久后决心更改打印控件的 ...

  10. 『Plotly实战指南』--柱状图绘制高级篇

    在数据可视化的世界里,柱状图是一种直观且强大的工具,用于展示数据的分布.比较和趋势. 从基础的柱状图出发,我们可以进一步探索更复杂的图表类型,如分组柱状图和堆积柱状图,它们在处理多维数据和复杂关系时具 ...