ASP.Net中的async+await異步編程的實現(xiàn)
在.NET Framework4.5框架、C#5.0語法中,通過async和await兩個關(guān)鍵字,引入了一種新的基于任務(wù)的異步編程模型(TAP)。在這種方式下,可以通過類似同步方式編寫異步代碼,極大簡化了異步編程模型。
用法:
public async Task<int> GetDotNetCountAsync() { // Suspends GetDotNetCount() to allow the caller (the web server) // to accept another request, rather than blocking on this one. var html = await _httpClient.GetStringAsync("https://dotnetfoundation.org"); return Regex.Matches(html, @"\.NET").Count; }
要點?。?!
1.“async”用來標(biāo)記一個方法為異步方法,異步方法體內(nèi)需結(jié)合“await”關(guān)鍵字使用,如果沒有await,則該方法等同于一個普通方法。異步方法命名規(guī)則通常以Async結(jié)尾。
2.“await”關(guān)鍵字只能在異步方法中使用。
3.當(dāng)在async異步方法中遇到await操作時,await會阻塞該異步方法不繼續(xù)往下執(zhí)行,并將該異步方掛起,將控制權(quán)轉(zhuǎn)到該異步方法的調(diào)用者手中。
4.異步方法的調(diào)用者獲得控制權(quán)之后:
1)如果調(diào)用者需要使用異步方法的返回結(jié)果,則繼續(xù)等待異步方法執(zhí)行完畢,再繼續(xù)往下執(zhí)行。
2)如果調(diào)用者不關(guān)心異步方法的返回結(jié)果,則繼續(xù)往下執(zhí)行。
場景一:async方法中未使用await
static void Main(string[] args) { Console.WriteLine("執(zhí)行前Main.....線程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步驟① GetResultAsync(); Console.WriteLine("執(zhí)行結(jié)束Main....線程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步驟② Console.ReadKey(); } async static Task<int> GetResultAsync() { Console.WriteLine("執(zhí)行前GetResult.....線程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步驟③ Task.Delay(3000).Wait(); Console.WriteLine("執(zhí)行結(jié)束GetResult.....線程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步驟④ return 10; }
執(zhí)行結(jié)果:步驟① ——>步驟③——>步驟④——>步驟②
結(jié)果分析:
我們會發(fā)現(xiàn),主函數(shù)Main調(diào)用異步方法GetResultAsync時,由于異步方法缺少“await”關(guān)鍵字,主函數(shù)需等異步方法步驟3,4全部執(zhí)行結(jié)束后再繼續(xù)執(zhí)行步驟2,執(zhí)行順序完全和同步方法執(zhí)行順序一致;
并且異步方法會給出語法提示:缺少“await”關(guān)鍵字
場景2:異步方法體內(nèi)遇到await之后,立即將控制權(quán)轉(zhuǎn)到調(diào)用者手中
static void Main(string[] args) { Console.WriteLine("執(zhí)行前Main.....線程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步驟① GetResultAsync(); Console.WriteLine("執(zhí)行結(jié)束Main....線程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步驟② Console.ReadKey(); } async static Task<int> GetResultAsync() { Console.WriteLine("執(zhí)行前GetResult.....線程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步驟③ await Task.Delay(3000); Console.WriteLine("執(zhí)行結(jié)束GetResult.....線程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步驟④ return 10; }
執(zhí)行結(jié)果:步驟① ——>步驟③——>步驟②——>步驟④
結(jié)果分析:
我們會發(fā)現(xiàn),主函數(shù)Main調(diào)用異步方法GetResultAsync,在遇到異步方法中“await”關(guān)鍵字時
1)阻塞了當(dāng)前異步方法并立即將控制權(quán)轉(zhuǎn)交給調(diào)用者主函數(shù)Main
2)主函數(shù)獲得控制權(quán)后繼續(xù)執(zhí)行方法體內(nèi)步驟2,GetResultAsync方法則異步執(zhí)行(等待異步操作結(jié)束之后執(zhí)行步驟4)。
場景3:異步方法體內(nèi)遇到await之后,立即將控制權(quán)轉(zhuǎn)到調(diào)用者手中,調(diào)用者需等待異步方法返回結(jié)果
static void Main(string[] args) { Console.WriteLine("執(zhí)行前Main.....線程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步驟① Task<int> res = GetResultAsync(); Console.WriteLine("執(zhí)行結(jié)束Main....線程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步驟② Console.WriteLine("執(zhí)行結(jié)果:" + res.Result + "....線程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步驟③ Console.ReadKey(); } async static Task<int> GetResultAsync() { Console.WriteLine("執(zhí)行前GetResult.....線程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步驟④ await Task.Delay(3000); Console.WriteLine("執(zhí)行結(jié)束GetResult.....線程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步驟⑤ return 10; }
執(zhí)行結(jié)果:步驟① ——>步驟④——>步驟②——>步驟⑤——>步驟③
結(jié)果分析:
我們會發(fā)現(xiàn),主函數(shù)Main調(diào)用異步方法GetResultAsync,在遇到異步方法中“await”關(guān)鍵字時
1)阻塞了當(dāng)前異步方法并立即將控制權(quán)轉(zhuǎn)交給調(diào)用者主函數(shù)Main
2)主函數(shù)獲得控制權(quán)后繼續(xù)執(zhí)行方法體內(nèi)步驟2和步驟3,GetResultAsync方法則異步執(zhí)行。
3)當(dāng)主函數(shù)執(zhí)行步驟3時,由于步驟3需要打印異步方法的返回結(jié)果,故需要等待異步方法結(jié)束才能繼續(xù)。所以需先執(zhí)行步驟5,然后再繼續(xù)執(zhí)行步驟3。
最后,異步編程的時候我們通常會結(jié)合Task來使用
到此這篇關(guān)于ASP.Net中的async+await異步編程的實現(xiàn)的文章就介紹到這了,更多相關(guān)ASP.Net async+await異步編程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
asp.net在Repeater嵌套的Repeater中使用復(fù)選框詳解
這篇文章主要介紹了asp.net在Repeater嵌套的Repeater中使用復(fù)選框,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12IIS Express 取代 ASP.NET Development
這篇文章主要介紹了IIS Express 取代 ASP.NET Development Server的配置方法,需要的朋友可以參考下2023-06-06將Excel中數(shù)據(jù)導(dǎo)入到Access數(shù)據(jù)庫中的方法
將Excel中數(shù)據(jù)導(dǎo)入到Access數(shù)據(jù)庫中的方法,需要的朋友可以參考一下2013-03-03詳解如何在ASP.NET Core Web API中以三種方式返回數(shù)據(jù)
這篇文章主要介紹了詳解如何在ASP.NET Core Web API中以三種方式返回數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01MVC 5 第二章 MVC5應(yīng)用程序項目結(jié)構(gòu)
通過本章學(xué)習(xí),你將了解到一個MVC 5應(yīng)用程序的項目組成以及項目文件的相關(guān)信息,從而更好地架構(gòu)設(shè)計出自己的項目結(jié)構(gòu)。2014-06-06blog程序新版本V2.0 Beta完成,提供V1.0全部源碼下載
blog程序新版本V2.0 Beta完成,提供V1.0全部源碼下載...2007-06-06jQuery+Asp.Net實現(xiàn)省市二級聯(lián)動功能的方法
這篇文章主要介紹了jQuery+Asp.Net實現(xiàn)省市二級聯(lián)動功能的方法,涉及asp.net數(shù)據(jù)庫讀取與字符串轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2017-05-05