国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

實(shí)際案例:在現(xiàn)有代碼中通過async/await實(shí)現(xiàn)并行

2019-11-17 03:26:09
字體:
供稿:網(wǎng)友

一項(xiàng)新技術(shù)或者一個新特性,只有你用它解決實(shí)際問題后,才能真正體會到它的魅力,真正理解它。也期待大家能夠多分享解一些解決實(shí)際問題的內(nèi)容。

在我們遭遇“黑色30秒”問題的過程中,切身體會到了異步的巨大作用(詳見asp.net線程角度對“黑色30秒”問題的全新分析),于是開始逐步地用async/await改造現(xiàn)有代碼。

今天早上在將一個MVC Controller中的Action改為異步的時候突然發(fā)現(xiàn)——其中有7個方法調(diào)用可以并行執(zhí)行。

public async Task<ActionResult> BlogPostInfo(string blogApp, int blogId, int postId, Guid blogUserGuid){    //7個方法無關(guān)聯(lián)的方法調(diào)用 }

如果通過async/await實(shí)現(xiàn)了這7個方法的并行,性能將會提高幾倍,真是一個意外的驚喜!

驚喜之后,則要面對這樣一個問題——如何以最低的成本實(shí)現(xiàn)?

這7個方法其他地方也在調(diào)用,不想直接把這些方法改為異步的;即使可以改為異步的,也不想一路改到底,最后在數(shù)據(jù)訪問層調(diào)用ADO.NET的異步方法。

。。。

接著在園子里發(fā)現(xiàn)了另外一個驚喜——Jesse Liu博文(async & await 的前世今生)中的一張圖片:

async/await實(shí)現(xiàn)并行

好帥的圖!連執(zhí)行順序都標(biāo)得清清楚楚。只要照著這張圖,就可以輕松地用async/await實(shí)現(xiàn)并行。

需要注意的地方:

1)并行調(diào)用的目標(biāo)方法必須是async的。

2)在并行期間,不能使用await。

以下是實(shí)現(xiàn)案例: 

下面的代碼是需要并行執(zhí)行的7個方法中的2個:

復(fù)制代碼
var tags = TagService.GetTag(blogId, postId);if (!string.IsNullOrEmpty(tags)){    info.Tags = string.Format("標(biāo)簽: {0}", TagService.GetTagLink(blogUrl, tags));}                var categories = CategoryService.GetCateList(blogUrl, blogId, postId);if (!string.IsNullOrEmpty(categories)){    info.Categories = "分類: " + categories;}
復(fù)制代碼

由于并行調(diào)用的目標(biāo)方法必須是async的,并且我們不想修改原有的方法實(shí)現(xiàn)代碼,所以我們增加2個async方法中轉(zhuǎn)一下:

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); });}

然后在調(diào)用代碼中,分別調(diào)用這2個async方法讓其并行執(zhí)行,之后再用await取執(zhí)行結(jié)果。

復(fù)制代碼
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("標(biāo)簽: {0}", TagService.GetTagLink(null, blogUrl, tags));}           var categories = await categoriesTask;if (!string.IsNullOrEmpty((categories))){    info.Categories = "分類: " + categories;}
復(fù)制代碼

真的很簡單,很輕松! async/await果然好用!


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 和田县| 宁蒗| 望城县| 永城市| 贡觉县| 达尔| 泗洪县| 合山市| 木里| 南康市| 墨玉县| 嵩明县| 同仁县| 华池县| 吐鲁番市| 古田县| 达孜县| 石城县| 天津市| 五常市| 剑川县| 华安县| 江津市| 且末县| 洪湖市| 花莲市| 密云县| 黎城县| 祁门县| 江油市| 吉水县| 沂源县| 丰城市| 临海市| 正镶白旗| 张掖市| 宁安市| 洞头县| 芦溪县| 庐江县| 勐海县|