布莱恩特:.NET Core开发精选文章目录,持续更新,欢迎投稿!​zhuanlan.zhihu.com

前言

1.什么是async/await?

await和async是.NET Framework4.5框架、C#5.0语法里面出现的技术,目的是用于简化异步编程模型。

2.async和await的关系?

async和await是成对出现的。async出现在方法的声明里,用于批注一个异步方法。光有async是没有意义的。await出现在方法内部,Task前面。只能在使用async关键字批注的方法中使用await关键字。

private async Task DoSomething()
{await Task.Delay(TimeSpan.FromSeconds(10));
}

3.async/await会创建新的线程吗?

不会。async/await关键字本身是不会创建新的线程的,但是被await的方法内部一般会创建新的线程。

http://4.asp.net mvc/webapi action中使用async/await会提高请求的响应速度吗?

不会。

正题

我们都知道web应用不同于winform、wpf等客户端应用,客户端应用为了保证UI渲染的一致性往往都是采用单线程模式,这个UI线程称为主线程,如果在主线程做耗时操作就会导致程序界面假死,所以客户端开发中使用多线程异步编程非常必要。

可web应用本身就是多线程模式,服务器会为每个请求分配工作线程。

既然async/await不能创建新线程,又不能使提高请求的响应速度,那.NET Web应用中为什么要使用async/await异步编程呢?

在 web 服务器上,.NET Framework 维护用于处理 http://ASP.NET请求的线程池。当请求到达时,将调度池中的线程以处理该请求。如果以同步方式处理请求,则处理请求的线程将在处理请求时处于繁忙状态,并且该线程无法处理其他请求。
在启动时看到大量并发请求的 web 应用中,或具有突发负载(其中并发增长突然增加)时,使 web 服务调用异步会提高应用程序的响应能力。异步请求与同步请求所需的处理时间相同。 如果请求发出需要两秒钟时间才能完成的 web 服务调用,则该请求将需要两秒钟,无论是同步执行还是异步执行。但是,在异步调用期间,线程在等待第一个请求完成时不会被阻止响应其他请求。因此,当有多个并发请求调用长时间运行的操作时,异步请求会阻止请求队列和线程池的增长。

下面用代码来实际测试一下: 先是同步的方式,代码很简单,就是输出一下请求开始和结束的时间和线程ID:

public ActionResult Index()
{DateTime startTime = DateTime.Now;//进入DoSomething方法前的时间var startThreadId = Thread.CurrentThread.ManagedThreadId;//进入DoSomething方法前的线程IDDoSomething();//耗时操作DateTime endTime = DateTime.Now;//完成DoSomething方法的时间var endThreadId = Thread.CurrentThread.ManagedThreadId;//完成DoSomething方法后的线程IDreturn Content($"startTime:{ startTime.ToString("yyyy-MM-dd HH:mm:ss:fff") } startThreadId:{ startThreadId }<br/>endTime:{ endTime.ToString("yyyy-MM-dd HH:mm:ss:fff") } endThreadId:{ endThreadId }<br/><br/>");
}/// <summary>
/// 耗时操作
/// </summary>
/// <returns></returns>private void DoSomething(){Thread.Sleep(10000);}

使用浏览器开3个标签页进行测试(因为浏览器对同一域名下的连接数有限制,一般是6个左右,所以就弄3个吧):

可以看到耗时都是10秒,开始和结束的线程ID一致。下面改造成异步的:

        public async Task<ActionResult> Index(){DateTime startTime = DateTime.Now;//进入DoSomething方法前的时间var startThreadId = Thread.CurrentThread.ManagedThreadId;//进入DoSomething方法前的线程IDawait DoSomething();//耗时操作DateTime endTime = DateTime.Now;//完成DoSomething方法的时间var endThreadId = Thread.CurrentThread.ManagedThreadId;//完成DoSomething方法后的线程IDreturn Content($"startTime:{ startTime.ToString("yyyy-MM-dd HH:mm:ss:fff") } startThreadId:{ startThreadId }<br/>endTime:{ endTime.ToString("yyyy-MM-dd HH:mm:ss:fff") } endThreadId:{ endThreadId }<br/><br/>");}/// <summary>/// 耗时操作/// </summary>/// <returns></returns>private async Task DoSomething(){await Task.Run(() => Thread.Sleep(10000));}

结果:

可以看到3次请求中,虽然耗时都是10秒,但是出现了开始和结束的线程ID不一致的情况,ID为22的这个线程工作了多次,这意味着使用异步方式在同一时间可以处理更多的请求!

IIS默认队列长度:

await关键字不会阻塞线程直到任务完成。它将方法的其余部分注册为任务的回调,并立即返回。当await的任务最终完成时,它将调用该回调,并因此在其中断时继续执行方法。

简单来说:就是使用同步方法时,线程会被耗时操作一直占有,直到耗时操作完成。而使用异步方法,程序走到await关键字时会立即return,释放线程,余下的代码会放进一个回调中(Task.GetAwaiter()的UnsafeOnCompleted(Action)回调),耗时操作完成时才会回调执行,所以async/await是语法糖,其本质是一个状态机。

那是不是所有的action都要用async/await呢?

不是。

一般的磁盘IO或者网络请求等耗时操作才考虑使用异步,不要为了异步而异步,异步也是需要消耗性能的,使用不合理会适得其反。

结论

async/await异步编程不能提升响应速度,但是可以提升响应能力(吞吐量)。异步和同步各有优劣,要合理选择,不要为了异步而异步。

来源:https://www.cnblogs.com/xhznl/p/13064731.html

同步方法 调用异步防范_.NET Web应用中为什么要使用async/await异步编程?相关推荐

  1. @async 默认线程池_.NET Web应用中为什么要使用async/await异步编程?

    布莱恩特:.NET Core开发精选文章目录,持续更新,欢迎投稿!​zhuanlan.zhihu.com 前言 1.什么是async/await? await和async是.NET Framework ...

  2. js异步解决方案 --- 回调函数 vs promise vs generater/yield vs async/await

    javascript -- 深度解析异步解决方案 高级语言层出不穷, 然而唯 js 鹤立鸡群, 这要说道js的设计理念, js天生为异步而生, 正如布道者朴灵在 node深入浅出--(有兴趣的可以读一 ...

  3. Microsoft.Bcl.Async 使用总结--在.NET Framework 4.5项目上使用.NET Framework 4.5版本及以上版本才可以使用C# 5中的async/await异步特

    正常情况下async/await异步特性,只能在.NET Framework 4.5以上的版本才可以使用,那如果想在.NET Framework 4使用C# 5中的异步特性怎么办呢?还好有一个开源的类 ...

  4. rabbitmq异步_在Node.js中使用RabbitMQ和Tortoise进行异步消息传递

    rabbitmq异步 RabbitMQ happens to be the easiest and most performant message broker platform using the ...

  5. 网页中调用matlab,在C#的Web项目中调用Matlab代码的步骤

    在C#的Web项目中调用Matlab代码的方法 为了毕设的图形检索方向的研究,本人需要在信科的师兄师姐们已经完成的C#界面中,调用现在研究的算法的Matlab代码,以便看到实验的效果.前段时间已经拖延 ...

  6. java获取web.xml 参数_解析web.xml中在Servlet中获取context-param和init-param内的参数

    web.xml里面可以定义两种参数:1.application范围内的参数,存放在servletcontext中,在web.xml中配置如下: context/param avalible durin ...

  7. jupyter调用py文件_解决Jupyter notebook中.py与.ipynb文件的import问题

    在jupyter notebook中,因为其解析文件的方式是基于json的,所以其默认保存的文件格式不是.py而是.ipynb.而.ipynb文件并不能简单的import进.py或者.ipynb文件中 ...

  8. java手机验证码登陆_在Web项目中手机短信验证码实现的全过程记录

    这篇文章主要给大家介绍了关于在Web项目中实现短信验证码的全过程记录,文中通过示例代码介绍的非常详细,在文末跟大家提供了源码下载,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧. 前言 最近在做 ...

  9. Async await 异步编程说明

    希望在编程上有些许提高所以 最近连续2篇博客都在说明多线程和异步编程的使用,异步和多线程之间区别请自行百度,因为理解不是特别透彻就不在叙述以免误导大家,这里写下新研究整理 task  和 await ...

最新文章

  1. MQTT Qos类型解释
  2. 小白学phoneGap《构建跨平台APP:phoneGap移动应用实战》连载四(使用程序载入事件)...
  3. 中 找多个平面_数学一轮复习30,平面向量的概念及线性运算,三个常用结论
  4. ProGuard中keep到底有什么作用
  5. 图书馆可以借到的书目
  6. 送书 | 主成分分析PCA
  7. 用单张2D图像重构3D场景
  8. 这些.Net的细节(面试秘笈),你都知道了吗?
  9. 现金贷风控生命周期——贷前风控
  10. 345取出值怎么算角度_资料分析怎么提分?这几个公式你必须会!
  11. 无损1080i到1080p是如何制作的
  12. 冰封USB3.0导入工具
  13. uniapp 获取时间戳
  14. 汽车维修企业管理【6】
  15. Hadoop实战第2版 - 电子书下载(高清版PDF格式+EPUB格式)
  16. JVM MAT分析器中的shallow heap 和 retained heap详解
  17. python面对对象建立自己的电子宠物的编码_父与子的编程之旅:与小卡特一起学Python(第3版)(全彩印刷)...
  18. 大牛讲解信号与系统(通俗易懂)
  19. 9个不错的PDF搜索引擎
  20. 一次项目开发中,收获的经验和教训

热门文章

  1. [渝粤教育] 三江学院 大学生创新基础课程 参考 资料
  2. 【渝粤教育】 国家开放大学2020年春季 1260软件工程 参考试题
  3. 【渝粤教育】电大中专幼儿园课程论 (10)作业 题库
  4. [渝粤教育] 中国地质大学 自动控制原理 复习题
  5. 【渝粤题库】国家开放大学2021春2509学前教育学题目
  6. 物联网中的无线通信模块到底是什么
  7. 尚未提交线上版本_ABRSM 线上演奏考试报名指引(目前考试仅限英国 amp; 部分国家及地区)...
  8. python str translate,str.translate() --文本过滤和处理
  9. python求一组数的最大值_python快速求一个数组的最大值/最小值及其索引
  10. 一文完整MySQL连接查询,笛卡尔乘积,内连接外连接交叉连接