在现有代码中通过async/await实现并行
在现有代码中通过async/await实现并行
一项新技术或者一个新特性,只有你用它解决实际问题后,才能真正体会到它的魅力,真正理解它。也期待大家能够多分享解一些解决实际问题的内容。
在我们遭遇“黑色30秒”问题的过程中,切身体会到了异步的巨大作用(详见从ASP.NET线程角度对“黑色30秒”问题的全新分析),于是开始逐步地用async/await改造现有代码。
今天早上在将一个MVC Controller中的Action改为异步的时候突然发现——其中有7个方法调用可以并行执行。
public async Task<ActionResult> BlogPostInfo(string blogApp, int blogId, int postId, Guid blogUserGuid)
{
//7个方法无关联的方法调用
}
如果通过async/await实现了这7个方法的并行,性能将会提高几倍,真是一个意外的惊喜!
惊喜之后,则要面对这样一个问题——如何以最低的成本实现?
这7个方法其他地方也在调用,不想直接把这些方法改为异步的;即使可以改为异步的,也不想一路改到底,最后在数据访问层调用ADO.NET的异步方法。
。。。
接着在园子里发现了另外一个惊喜——Jesse Liu的博文(async & await 的前世今生)中的一张图片:

好帅的图!连执行顺序都标得清清楚楚。只要照着这张图,就可以轻松地用async/await实现并行。
需要注意的地方:
1)并行调用的目标方法必须是async的。
2)在并行期间,不能使用await。
以下是实现案例:
下面的代码是需要并行执行的7个方法中的2个:

var tags = TagService.GetTag(blogId, postId);
if (!string.IsNullOrEmpty(tags))
{
info.Tags = string.Format("标签: {0}", TagService.GetTagLink(blogUrl, tags));
} var categories = CategoryService.GetCateList(blogUrl, blogId, postId);
if (!string.IsNullOrEmpty(categories))
{
info.Categories = "分类: " + categories;
}

由于并行调用的目标方法必须是async的,并且我们不想修改原有的方法实现代码,所以我们增加2个async方法中转一下:
async方法1:
public static async Task<string> GetTagAsync(int blogId, int entryId)
{
return await Task.Run(() => { return GetTag(blogId, entryId); });
}
async方法2:
public static async string GetCateListAsnyc(string blogUrl, int blogId, int entryId)
{
return await Task.Run(() => { return GetCateList(blogUrl, blogId, entryId); });
}
然后在调用代码中,分别调用这2个async方法让其并行执行,之后再用await取执行结果。

var tagsTask = TagService.GetTagAsync(blogId, postId);
var categoriesTask = BlogCategoryService.GetCateListAsync(blogUrl, blogId, postId); var tags = await tagsTask;
if (!string.IsNullOrEmpty(tags))
{
info.Tags = string.Format("标签: {0}", TagService.GetTagLink(null, blogUrl, tags));
} var categories = await categoriesTask;
if (!string.IsNullOrEmpty((categories)))
{
info.Categories = "分类: " + categories;
}

真的很简单,很轻松! async/await果然好用!
在现有代码中通过async/await实现并行的更多相关文章
- 实际案例:在现有代码中通过async/await实现并行
一项新技术或者一个新特性,只有你用它解决实际问题后,才能真正体会到它的魅力,真正理解它.也期待大家能够多分享解一些解决实际问题的内容. 在我们遭遇“黑色30秒”问题的过程中,切身体会到了异步的巨大作用 ...
- .NET通过async/await实现并行
如果可以并行可以大大提高性能,但在我们的使用中,不可能全是并行的也是要有线行操作,所以我们需要在业务逻辑层进行并行操作的护展: 数据访问层不变还是以前一样如下: public class UserDA ...
- 【TypeScript】如何在TypeScript中使用async/await,让你的代码更像C#。
[TypeScript]如何在TypeScript中使用async/await,让你的代码更像C#. async/await 提到这个东西,大家应该都很熟悉.最出名的可能就是C#中的,但也有其它语言也 ...
- js循环中使用async/await踩过的坑
最近写koa的时候遇见需要在循环中使用async/await的情况,当然第一反应就是直接上forEach,然后就直接翻车了... 直接上代码: function handleSql(val) { re ...
- 理解ES7中的async/await
理解ES7中的async/await 优势是:就是解决多层异步回调的嵌套 从字面上理解 async/await, async是 "异步"的含义,await可以认为是 async w ...
- js中的async await
JavaScript 中的 async/await 是属于比较新的知识,在ES7中被提案在列,然而我们强大的babel粑粑已经对它进行列支持! 如果开发中使用了babel转码,那么就放心大胆的用吧. ...
- 理解C#中的 async await
前言 一个老掉牙的话题,园子里的相关优秀文章已经有很多了,我写这篇文章完全是想以自己的思维方式来谈一谈自己的理解.(PS:文中涉及到了大量反编译源码,需要静下心来细细品味) 从简单开始 为了更容易理解 ...
- [C#] .NET4.0中使用4.5中的 async/await 功能实现异
好东西需要分享 原文出自:http://www.itnose.net/detail/6091186.html 在.NET Framework 4.5中添加了新的异步操作库,但是在.NET Framew ...
- 在Silverlight中使用async/await
现在 async/await 大行其道,确实,有了 async/await ,异步编程真是简单多了,个人觉得 async/await 的出现,给开发者还来的方便,绝不亚于当年 linq 的出现. 但要 ...
随机推荐
- HDU 2082-找单词(母函数)
找单词 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- UML对象图和包图
UML九已经介绍过的基本图,然后,我们再来看看对象图和包图. 一.对象图 谈到对象.我们不得不说一下对象.对象(Object)是对象类的实例(Instance),用于模型化特定的实体.对象是唯一的. ...
- Entity Framework 6.1
Entity Framework 6.1-Code First Code First-代码优先,先创建好领域模型.根据... 2014-04-21 14:56 阅读(6858) 评论(0) Ent ...
- jquery 访问控制菜单
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHpqOTExOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...
- C#:winform项目在win7,xp32位和64位都能执行
vs中项目配置管理器活动解决方式平台选择X86平台.
- kubernetes多节点部署的决心
注:以下操作均基于centos7系统. 安装ansible ansilbe能够通过yum或者pip安装,因为kubernetes-ansible用到了密码.故而还须要安装sshpass: pip in ...
- crawler_基于块儿统计正文抽取_改进版
在线查看效果:http://tool.haoshuju.cn/ import java.util.ArrayList; import java.util.Arrays; import java.uti ...
- Objective-C马路成魔【12-分类和协议】
郝萌主倾心贡献.尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠,支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 分类与协议 ...
- JavaEE Tutorials (2) - 使用教程示例
2.1 必要软件27 2.1.1 Java EE 7软件开发包28 2.1.2 Java平台标准版28 2.1.3 Java EE 7教程组件28 2.1.4 NetBeans IDE29 2.1.5 ...
- 认识bash这个shell
我们通过shell将我们输入的命令与内核通信,好让内核可以控制硬件来正确无误地工作bash是我们Linux默认的shell 用户界面(Shell,application)--------核心(Kern ...