等到花儿也谢了的await
async/task/await三组合是.NET Framework 4.5带给.NET开发者的大礼,合理地使用它,可以提高应用程序的吞吐能力。
但是它的使用有点绕人,如果不正确使用,会带来意想不到的问题——比如await之后一直在等待,等到花儿也谢了,也等不来。
这篇博文将向你展示我们在实际开发中遇到的这个问题。
先看一段ASP.NET MVC示例代码:
public class BlogController : Controller {public async Task<ActionResult> AwaitDemo(){var responseHtml = GetResponseHtml("http://www.cnblogs.com/");return Content(responseHtml);}private string GetResponseHtml(string url){return GetResponseContentAsync(url).Result;}private async Task<string> GetResponseContentAsync(string url){var httpClient = new System.Net.Http.HttpClient();var response = await httpClient.GetAsync(url);if (response.StatusCode == System.Net.HttpStatusCode.OK){return await response.Content.ReadAsStringAsync();}else{return "error";}} }
代码说明:
- 在上面的代码中,虽然在Action方法之前加了async Task<ActionResult>,但由于在方法体中没有使用await,所以实际还是以同步的方式执行的,与直接使用ActionResult是一样的。
- GetResponseHtml是同步方法,GetResponseContentAsync是异步方法,在GetResponseHtml中调用了异步的GetResponseContentAsync。(如果调用的是第三方程序集,我们就不知道在GetResponseHtml中进行了异步调用,所以这个方法的设计是有问题的)
这段代码执行结果会是怎样呢?
——结果就是没有结果,一直在执行。。。
(注:如果在控制台应用程序中调用同样的GetResponseHtml,不会出现这个问题)
那如果解决这个问题呢:
解决方法一:在MVC Action中开启一个Task进行await
public async Task<ActionResult> AwaitDemo() {var responseHtml = await Task.Factory.StartNew(() => GetResponseHtml("http://www.cnblogs.com/"));return Content(responseHtml); }
解决方法二:将GetResponseHtml变成异步方法
public async Task<ActionResult> AwaitDemo() {var responseHtml = await GetResponseHtml("http://www.cnblogs.com/");return Content(responseHtml); }private async Task<string> GetResponseHtml(string url) {return await GetResponseContentAsync(url); }
显然,第2个解决方法是更好的。
所以,我们在设计一个方法(method)时,如果调用了async方法,一定要将这个方法本身设计为async的。不然,别人调用时很容易踩着这个坑,然后就一直等啊等。。。等到花儿谢了,电脑冒烟了,也等不到。
【相关链接】
转载于:https://www.cnblogs.com/sjqq/p/7341027.html
等到花儿也谢了的await相关推荐
- 我等到花儿也谢 - 张学友 - 真爱
我等到花儿也谢 - 张学友 - 真爱 我等到花儿也谢词 吴庆康曲 李伟菘·陈少琪 每个人都在问我到底还在等什么 等到春夏秋冬都过了难道还不够 其实是因为我的心有一个缺口 等待拿走的人把它还给我 每个人 ...
- 我等到花儿也谢了(国语)铃声 我等到花儿也谢了(国语)手机铃声...
链接:http://www.baidushifen.cn/mp3/9071.html 来自 " ITPUB博客 " ,链接:http://blog.itpub.net/144634 ...
- react native 初构建之我等到花儿都谢了
啰嗦几句 最近 react native 这货貌似很火,如果想让我从技术角度讲述她为什么那么火,那我就不献丑了.很多喜欢刨根问底的程序猿,攻城狮比我说的明白多了.从我的角度来说,我很喜欢 react ...
- Pod 一直停留在 Terminating 状态,我等得花儿都谢了~
更多奇技淫巧欢迎订阅博客:https://fuckcloudnative.io 前言 近期,弹性云线上集群发生了几起特殊的容器漂移失败事件,其特殊之处在于容器处于 Pod Terminating 状态 ...
- OpenGL 3.0,等得花儿都谢了
2007年8月8日,OpenGL ARB宣布9月份将公布OpenGL 3.0规范,也就是彻底解决老API和当今硬件功能脱节问题的全新API体系,也是2001年曾经本来期望OpenGL 2.0规范要做而 ...
- 面试:TCP协议经典十五连问!
以下文章来源方志朋的博客,回复"666"获面试宝典 前言 TCP协议是大厂面试必问的知识点.整理了15道非常经典的TCP面试题,希望大家都找到理想的offer呀 1. 讲下TCP ...
- Java浮点值拒绝服务漏洞危害分析
By 空虚浪子心 http://www.inbreak.net/ JAVA出了漏洞,CVE-2010-4476,会导致拒绝服务攻击.大家能从公告上,看到这样一段代码,挺长的.意思是只有开发人员写出这样 ...
- day 0314函数的进阶
1.空间:内置空间,全局空间,局部空间. 内置空间:空间存放python解释器,为我们提供了方便的名字:input,print,str,list,tuple 三个空间的加载顺序: 内置空间>&g ...
- 在Ubuntu下搭建FTP服务器的方法
由于整个学校相当于一个大型局域网,相互之间传送数据非常快,比如要共享个电影,传点资料什么的. 所以我们可以选择搭建一个FTP服务器来共享文件. 那么问题来了,有的同学会问,我们既然在一个局域网内,直接 ...
- 【趣味分享】C#实现回味童年的24点算法游戏
一.24点游戏玩法规则效果展示 1.初始化界面 2.开始游戏界面 3.游戏超时界面 4.查看答案界面 5.答对界面 6.答错界面 7.计算表达式的验证界面 8.一副牌算完开始新一副牌界面 到这里24点 ...
最新文章
- python两数交换 函数_Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?...
- SAP UI5 使用 CSS 的一些注意事项
- Linux中fdisk对应的c函数,linux下fdisk命令实战案例之详解
- com.alibaba.easyexcel导出指定的列_使用Python导入导出Excel表格
- CMU黑科技,手机录视频,实现人脸3D建模的高度逼真
- NumPy————NumPy广播机制的学习笔记
- java 证书缺乏扩展项_java解析证书的例子(包括基本项目、扩展项目)
- C++编程语言中的值传递(pass-by-value)和引用传递(pass-by-reference)介绍
- 2023计算机考研资料分享
- Matlab求极限图解
- 两代 2011/2014 Mac Mini 硬盘SSD性能提升研究。(SSD固态硬盘研究)
- 02_爬取灌篮高手全国大赛漫画
- C语言系列1——hello world
- 应用之星破除行业门槛 零成本开发手机应用
- 使用 vscode 编辑html后缀但包含jsp、django、erb、php模板标签时,配置实现正确格式化文档
- 统计在线人数、每日访问人数和总人数
- C++:匿名函数(Lambda函数)简介
- 英语四六级作文句型收集
- 【计算机网络相关】内网穿透介绍
- Python记10(pyqt5
热门文章
- 【蓝桥杯】枚举,模拟,排序专题 (一)
- 微信公众平台iPhone版开始内测了
- 两个分数相加(结果最简)
- [线段树][数学] Jzoj P4237 Melancholy
- 条款30:透彻了解inlining的里里外外
- 用微型计算机原理做流水灯,微机原理流水灯设计.doc
- 数组unshift_数组unshift()方法以及JavaScript中的示例
- 什么是 DNS MX 记录?
- 邮件服务器没有MX类型,mx记录和邮件服务器的关系究竟是什么?
- java编写的atm机项目结题报告_结题报告 - eason66 - 博客园