参考:

.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. DeepSeek太火,但老板们别慌,这里有份AI项目开展手册

    关注公众号回复1 获取一线.总监.高管<管理秘籍> 这两天有老板陆续在咨询:到底应该如何基于DeepSeek开展AI项目? 抛开一些偏细节.偏敏感的付费内容,其实有一套方法论倒是可以分享. ...

  2. 小程序开发实战案例五 | 小程序如何嵌入H5页面

    在接入小程序过程中会遇到需要将 H5 页面集成到小程序中情况,今天我们就来聊一聊怎么把 H5 页面塞到小程序中. 本篇文章将会从下面这几个方面来介绍: 小程序承载页面的前期准备 小程序如何承载 H5 ...

  3. Salt key 系统的接口

    官方文档:https://docs.saltstack.com/en/3000/ref/wheel/all/salt.wheel.key.html Wheel 系统包装了Salt key 系统,以编程 ...

  4. vue中的find()函数的用法与扩展用法

    find函数基本格式:let obj=this.list.find(item=>item.code===val)首先在这里我们要知道的两个基础知识一.find是一个查找函数.二.箭头函数find ...

  5. Thymeleaf Split

    <th:block th:each="image : ${#strings.listSplit(goods.images, ';')}"> <img th:src ...

  6. php的token管理类(AI生成)

    当然,以下是一个简单的 PHP 类,用于生成和管理令牌(token).这个类可以生成一个随机的令牌.验证令牌是否有效,并允许设置一个令牌的过期时间. <?php class Token { pr ...

  7. pycharm clone GitHub 提示 OpenSSL SSL_read: Connection was reset, errno 10054

    配置界面 错误提示 原因分析 clone的时候需要安全认证,当你在配置页面勾选上ssh ,就会报错 解决方案 在cmd里输入命令,然后再clone git config --global http.s ...

  8. Vue2框架-基础

    1. vue简介 什么是vue? Vue是一套用于构建用户界面的渐进式JavaScript框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,方便与第三方 ...

  9. Visio绘制时间轴安排图的方法

      本文介绍基于Visio软件绘制时间轴.日程安排图.时间进度图等的方法.   在很多学习.工作场合中,我们往往需要绘制如下所示的一些带有具体时间进度的日程安排.工作流程.项目进展等可视化图表.    ...

  10. kubeadm init 或 join 失败 [kubelet-check] Initial timeout of 40s passed.

    前言 kubeadm 初始化或 join 时,报错: [etcd] Creating static Pod manifest for local etcd in "/etc/kubernet ...