博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实际案例:在现有代码中通过async/await实现并行
阅读量:6093 次
发布时间:2019-06-20

本文共 1911 字,大约阅读时间需要 6 分钟。

一项新技术或者一个新特性,只有你用它解决实际问题后,才能真正体会到它的魅力,真正理解它。也期待大家能够多分享解一些解决实际问题的内容。

在我们遭遇“黑色30秒”问题的过程中,切身体会到了异步的巨大作用(详见),于是开始逐步地用async/await改造现有代码。

今天早上在将一个MVC Controller中的Action改为异步的时候突然发现——其中有7个方法调用可以并行执行。

public async Task
BlogPostInfo(string blogApp, int blogId, int postId, Guid blogUserGuid){ //7个方法无关联的方法调用 }

如果通过async/await实现了这7个方法的并行,性能将会提高几倍,真是一个意外的惊喜!

惊喜之后,则要面对这样一个问题——如何以最低的成本实现?

这7个方法其他地方也在调用,不想直接把这些方法改为异步的;即使可以改为异步的,也不想一路改到底,最后在数据访问层调用ADO.NET的异步方法。

。。。

接着在园子里发现了另外一个惊喜——博文()中的一张图片:

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
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果然好用!

转载于:https://www.cnblogs.com/dudu/p/async_await_parallel.html

你可能感兴趣的文章
禁止windows2003 关机选项
查看>>
Log4Net
查看>>
人生不相见,动如参与商
查看>>
禁止双击选择页面内容
查看>>
HDU5037 Frog
查看>>
程序集冲突问题
查看>>
LeetCode 766. Toeplitz Matrix
查看>>
Java序列化反序列化对象流ObjectInputStream、ObjectOutputStream
查看>>
Spring与Mybatis的整合
查看>>
WinForm 弹框确认后执行
查看>>
Linux面试题
查看>>
! [rejected] master -> master (non-fast-forward)
查看>>
STL unique
查看>>
装饰自己的博客园界面
查看>>
django-返回客户端外网ip服务
查看>>
linux内核初始化控制流
查看>>
A Wasserstein Distance[贪心/模拟]
查看>>
推荐几个比较好的网站
查看>>
Project Euler 45 Triangular, pentagonal, and hexagonal( 二分 + 函数指针 )
查看>>
为什么成员属性不会被重写
查看>>