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相关推荐

  1. 我等到花儿也谢 - 张学友 - 真爱

    我等到花儿也谢 - 张学友 - 真爱 我等到花儿也谢词 吴庆康曲 李伟菘·陈少琪 每个人都在问我到底还在等什么 等到春夏秋冬都过了难道还不够 其实是因为我的心有一个缺口 等待拿走的人把它还给我 每个人 ...

  2. 我等到花儿也谢了(国语)铃声 我等到花儿也谢了(国语)手机铃声...

    链接:http://www.baidushifen.cn/mp3/9071.html 来自 " ITPUB博客 " ,链接:http://blog.itpub.net/144634 ...

  3. react native 初构建之我等到花儿都谢了

    啰嗦几句 最近 react native 这货貌似很火,如果想让我从技术角度讲述她为什么那么火,那我就不献丑了.很多喜欢刨根问底的程序猿,攻城狮比我说的明白多了.从我的角度来说,我很喜欢 react ...

  4. Pod 一直停留在 Terminating 状态,我等得花儿都谢了~

    更多奇技淫巧欢迎订阅博客:https://fuckcloudnative.io 前言 近期,弹性云线上集群发生了几起特殊的容器漂移失败事件,其特殊之处在于容器处于 Pod Terminating 状态 ...

  5. OpenGL 3.0,等得花儿都谢了

    2007年8月8日,OpenGL ARB宣布9月份将公布OpenGL 3.0规范,也就是彻底解决老API和当今硬件功能脱节问题的全新API体系,也是2001年曾经本来期望OpenGL 2.0规范要做而 ...

  6. 面试:TCP协议经典十五连问!

    以下文章来源方志朋的博客,回复"666"获面试宝典 前言 TCP协议是大厂面试必问的知识点.整理了15道非常经典的TCP面试题,希望大家都找到理想的offer呀 1.  讲下TCP ...

  7. Java浮点值拒绝服务漏洞危害分析

    By 空虚浪子心 http://www.inbreak.net/ JAVA出了漏洞,CVE-2010-4476,会导致拒绝服务攻击.大家能从公告上,看到这样一段代码,挺长的.意思是只有开发人员写出这样 ...

  8. day 0314函数的进阶

    1.空间:内置空间,全局空间,局部空间. 内置空间:空间存放python解释器,为我们提供了方便的名字:input,print,str,list,tuple 三个空间的加载顺序: 内置空间>&g ...

  9. 在Ubuntu下搭建FTP服务器的方法

    由于整个学校相当于一个大型局域网,相互之间传送数据非常快,比如要共享个电影,传点资料什么的. 所以我们可以选择搭建一个FTP服务器来共享文件. 那么问题来了,有的同学会问,我们既然在一个局域网内,直接 ...

  10. 【趣味分享】C#实现回味童年的24点算法游戏

    一.24点游戏玩法规则效果展示 1.初始化界面 2.开始游戏界面 3.游戏超时界面 4.查看答案界面 5.答对界面 6.答错界面 7.计算表达式的验证界面 8.一副牌算完开始新一副牌界面 到这里24点 ...

最新文章

  1. python两数交换 函数_Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?...
  2. SAP UI5 使用 CSS 的一些注意事项
  3. Linux中fdisk对应的c函数,linux下fdisk命令实战案例之详解
  4. com.alibaba.easyexcel导出指定的列_使用Python导入导出Excel表格
  5. CMU黑科技,手机录视频,实现人脸3D建模的高度逼真
  6. NumPy————NumPy广播机制的学习笔记
  7. java 证书缺乏扩展项_java解析证书的例子(包括基本项目、扩展项目)
  8. C++编程语言中的值传递(pass-by-value)和引用传递(pass-by-reference)介绍
  9. 2023计算机考研资料分享
  10. Matlab求极限图解
  11. 两代 2011/2014 Mac Mini 硬盘SSD性能提升研究。(SSD固态硬盘研究)
  12. 02_爬取灌篮高手全国大赛漫画
  13. C语言系列1——hello world
  14. 应用之星破除行业门槛 零成本开发手机应用
  15. 使用 vscode 编辑html后缀但包含jsp、django、erb、php模板标签时,配置实现正确格式化文档
  16. 统计在线人数、每日访问人数和总人数
  17. C++:匿名函数(Lambda函数)简介
  18. 英语四六级作文句型收集
  19. 【计算机网络相关】内网穿透介绍
  20. Python记10(pyqt5

热门文章

  1. 【蓝桥杯】枚举,模拟,排序专题 (一)
  2. 微信公众平台iPhone版开始内测了
  3. 两个分数相加(结果最简)
  4. [线段树][数学] Jzoj P4237 Melancholy
  5. 条款30:透彻了解inlining的里里外外
  6. 用微型计算机原理做流水灯,微机原理流水灯设计.doc
  7. 数组unshift_数组unshift()方法以及JavaScript中的示例
  8. 什么是 DNS MX 记录?
  9. 邮件服务器没有MX类型,mx记录和邮件服务器的关系究竟是什么?
  10. java编写的atm机项目结题报告_结题报告 - eason66 - 博客园