c# 异步( Async ) 不是多线程
 
误解 async

在调试 xxxxAsync() 方法的时候,常常会看到调试器界面中会多出一些线程,直觉上误认为 Async 冠名的函数是多线程。 对于 StringReader 中的 ReadAsync() 方法的确如此,
ReadAsync() 在内部调用 Task.FromResult(),而 Task 正是微软提供封装完整的线程池。但是对于 HttpClient 中的 GetStringAsyncCore() 则是由 async 修饰的异步函数。

由于多线程和异步函数都可能冠上 Async 因此,一开始容易误以为 async 等于 异步。在多线程或异步函数上冠名 Async 则是一种默认的命名规范。

异步、多线程的区别

异步 : 属于通信的范畴,在发出消息当下不等待对方回应,便开始继续自己的任务。所以 c# 的很多 _异步_ 操作都在 io 、 socket 这些类库下面,都是通信性质的类库,

io 可以理解向系统内核发送文件数据
 
多线程 : 属于计算范畴,通常是关于如果利用 cpu 的空闲时间进行计算。
异步同多线程可以完美的结合,服务器开启多个线程监听前端请求,接收处理完毕后,可以异步地将数据序列化到磁盘,当然如果需要知道序列化的结果则异步处理可以等待 ( await )。

从这个例子不难知道,多线程是提高数据的计算能力,而异步则是为了提高程序的吞吐量。
异步的硬件支持

计算机硬件需要依赖中断来请求 cpu 进行计算,但是中断需要存储上下文而且耗费性能,不能频繁中断 cpu 。当进行 io 操作时,一般会在用户态上进行缓存,

这时数据在内存上,接下来 cpu 切到系统态上,让 Direct Memory Access (DMA) 完成数据传输,这时 cpu 完全不过问 io 操作,待 DMA 完成时,会将在寄存器上做标记。

异步的程序原理

异步是将程序分成几个部分,每部分由一个状态控制,最后形成一个有限状态机。

c# 异步( Async ) 不是多线程的更多相关文章

  1. 使用@Async注解创建多线程,自定义线程池

    说明 使用@Async注解创建多线程非常的方便,还可以通过配置,实现线程池.比直接使用线程池简单太多.而且在使用上跟普通方法没什么区别,加上个@Async注解即可实现异步调用. 用法 AsyncTas ...

  2. 【快学springboot】10.使用@Async注解创建多线程,自定义线程池

    说明 使用@Async注解创建多线程非常的方便,还可以通过配置,实现线程池.比直接使用线程池简单太多.而且在使用上跟普通方法没什么区别,加上个@Async注解即可实现异步调用. 用法 AsyncTas ...

  3. 同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式

    1. 概念理解        在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:   同步/异步主要针对C端: 同步:    ...

  4. .NET为什么要使用异步(async)编程?⭐⭐⭐⭐⭐

    .NET为什么要使用异步(async)编程? 有几点坐下笔记 ⭐⭐⭐⭐: 1. 同步方法 static void Main(string[] args) { Console.WriteLine($&q ...

  5. 一代版本一代神:利用Docker在Win10系统极速体验Django3.1真实异步(Async)任务

    一代版本一代神:利用Docker在Win10系统极速体验Django3.1真实异步(Async)任务 原文转载自「刘悦的技术博客」https://v3u.cn/a_id_177 就在去年(2019年) ...

  6. 新手浅谈Task异步编程和Thread多线程编程

    初学Task的时候上网搜索,看到很多文章的标题都是task取代thread等等相关,我也一直以为task和thread是一类,其实task是.net4.0提出的异步编程,在之前.net1.0有dele ...

  7. libcurl的封装,支持同步异步请求,支持多线程下载,支持https

    最近在做一个项目,需要用到http get post等 需求分析需要做到同步和异步,异步请求的返回以可选的回调通知的方式进行. 本人以Linux为例,一步一步的来实现. 配置并且编译libcurl我以 ...

  8. Python 进阶 异步async/await

    一,前言 本文将会讲述Python 3.5之后出现的async/await的使用方法,我从上看到一篇不错的博客,自己对其进行了梳理.该文章原地址https://www.cnblogs.com/dhcn ...

  9. 异步 async & await

    1 什么是异步 异步的另外一种含义是计算机多线程的异步处理.与同步处理相对,异步处理不用阻塞当前线程来等待处理完成,而是允许后续操作,直至其它线程将处理完成,并回调通知此线程. 2 异步场景 l  不 ...

随机推荐

  1. mysql 创建分组

    mysql> select * from table1; +----------+------------+-----+---------------------+ | name_new | t ...

  2. Beta冲刺(1/5)

    队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 初步任务分配 提交记录(全组共用) 接下来的计划 完善接口文档 还剩下哪些任务 学习软工的理论课 学习代码评估.测试 燃尽 ...

  3. QML学习(一)——<简要概念知识点>

    转载:https://www.cnblogs.com/dengyg0710/p/10644936.html 1.一个 QML 文档有且只有一个根元素. 2.QML 元素名后所有内容使用 {} 包围起来 ...

  4. msyql8.0编译安装

    1.安装依赖 yum  -y install wget  cmake gcc gcc-c++ncurses  ncurses-devel  libaio-devel openssl openssl-d ...

  5. NIO Channel Scatter/Gather 管道Pipe类

    通道提供了一种被称为Scatter/Gather的重要新功能(有时也被称为矢量I/O).Scatter/Gather是一个简单却强大的概念,它是指在多个缓冲区上实现一个简单的I/O操作.对于一个wri ...

  6. free中buffer 与 cache 的区别

    通常人们所说的Cache就是指缓存SRAM. SRAM叫静态内存,“静态”指的是当我们将一笔数据写入SRAM后,除非重新写入新数据或关闭电源,否则写入的数据保持不变. 由于CPU的速度比内存和硬盘的速 ...

  7. golang 内存监控

    golang 内存监控 - 简书 https://www.jianshu.com/p/38dc129b6870

  8. Android -------- BouncingJellyView 果冻视图(阻尼效果)

    分享一个不错的效果,分享给大家 BouncingJellyView 果冻视图,就像果冻一样伸缩弹跳,也叫阻尼效果.这个效果在MIUI上面到处都可以看到. 效果图: 使用 项目更目录bulid.grad ...

  9. typescript - 6.泛型

    泛型类 class MinClas<T>{ public list:T[]=[]; add(value:T):void{ this.list.push(value); } min():T{ ...

  10. Tomcat中加载不到项目 项目构建Deployment Assembly报错:The given project is not a virtual component project

    转:   The given project is not a virtual component project The given project is not a virtual compone ...