{eyou:include file='banner.htm'/}
ASP.Net中的async+await異步編程的實(shí)現
2026-05-04 13:13:09
8884
[摘要] 天津九安特機電工程有限公司(www.hunqingrc.com)這篇文章主要介紹了ASP.Net中的async+await異步編程的實(shí)現,文中通過(guò)示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價(jià)值,需要的朋友們下面隨著(zhù)小編來(lái)一起學(xué)習學(xué)習吧在.NET

這篇文章主要介紹了A(′?_?`)SP.Net中的異步async+await異步編程的實(shí)現,(?_?;)文中通過(guò)示例代碼介紹的編程非常詳細,對大家的異步學(xué)習或者工(′;ω;`)作具有一定的參考學(xué)習價(jià)值,需要的編程朋友們下面隨著(zhù)小編來(lái)一起學(xué)習學(xué)習吧

在(zai).NET Framework4.5框架、C#5.0語(yǔ)法中,異步通過(guò)async和await兩個(gè)關(guān)鍵字,編程引入了一種新的異步基于任務(wù)的異步編(′▽?zhuān)?)程模型(TAP)。在這種方式下,編??程可以通過(guò)類(lèi)似同步方式編寫(xiě)異步代碼,異步極大簡(jiǎn)化了異步編程模型。編程

用法:

public async Task<int> GetDotNetC(╯‵□′)╯ountAsync()
{
// Suspends GetDotNetCount() to allow the caller (the web server)
// to accept another request,異步 rather than blocking on this one.
var ht(?????)ml = await _httpClient.GetStringAsync("https://dotnetfoundation.org");(′;ω;`)

return Regex.Matches(html, @"\.NET").Count;
}

要點(diǎn)??!編程!異步

1.“async”用來(lái)標記一個(gè)方法為異步方法,編程異步方法體內(nei)需結合“(′?`*)await”關(guān)鍵字使用,異步如果沒(méi)有await,則該方法等同于一個(gè)普通方(fang)法。異步方法命名規則通常以Async結尾。

2.“await”關(guān)鍵字只能(???)在異步方法中使用。

3.當在async異步方法中??遇到await操作時(shí),await會(huì )阻塞該異步方法不繼續往下執行,并將該異步方掛起,將控制權轉到該異步方法的調用者手中。(′?_?`)

4.異步方法的調用者獲得控制權之后:

1)如果調用者需要使用異步方法的返回結果,則繼續等待異步方法執行完畢,再繼續往下執行。

2)如果調用者不關(guān)心異步方法的返回結果,則繼續往下執行。

場(chǎng)景一:async方法中未使用await

static void Main(string[] args)
{
Coヾ(′▽?zhuān)??nsole.WriteLine("執行前Main.....線(xiàn)程ID:" + Thread.CurrentThread.Man??agedThreadId.ToString());/ヽ(′▽?zhuān)?ノ/步驟①
Get(?_?;)ResultAsync();
Console.WriteLine("執行結束Main.(′?`)...線(xiàn)程ID:" + Thr??ead.CurrentThread.ManagedThreadId.ToString());//步驟②
Console??.ReadKey();
}


async static Task<int(╯‵□′)╯> Ge??tResultAsync()
{
Console.WriteLine("執行前GetResult...??..線(xiàn)程ID:" + Thread.CurrentThread.Mana???gedThreadId.ToString());//步驟③ Task.Delay(3000).Wait();
Console.WriteLine("執行結束GetResult.....線(xiàn)程ID:" + Thread.CurrentT(???)hr??ead.Manage??dThreadId.ToString());//步驟④
return 10;
}

執行結果:步驟① ——&(′ω`)gt;步驟③——>步驟④——>步驟②

結果(′?_?`)分析:

我們會(huì )發(fā)現,主函數Main調用異步方法GetResultAsync時(shí),由于異步方法缺少“await”關(guān)鍵字,主函數┐(′д`)┌需等異步方法步驟3,4全部執行結束后再繼續執行步驟2,執行順序完全和同步方法執行順序一致;

并且異步方法會(huì )給出語(yǔ)法提示:缺少“await”(╥_╥)關(guān)鍵字

場(chǎng)景2:異步方法體內遇到await之后,立即將控制權轉到調用者手中??

static void Main(string[] args??)
{
Console.WriteLine("執行前Main.??....線(xiàn)程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步驟① GetResultAsy(′ω`*)nc();
Console.WriteLine("執行結束Main....線(xiàn)程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步驟②(′?_?`)
Console.Rea(°ロ°) !dKey();
}
async static Task<int> GetResultAsync()
{
Console.WriteLine("執行前GetResultヾ(′?`)?.....線(xiàn)程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步驟③
await Task.Delay(3000);
Console.WriteLine("執行結束GetResult.....線(xiàn)程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步驟④
return 10(′;д;`);
}

執行結果:(′▽?zhuān)?)步驟① &mdas??h;—??>步驟③——>步??驟②——>步驟④

結果分析:

我們會(huì )發(fā)現,主函數Main調用異步方法GetResultAsync,在遇到異步方法中“await&rdq┐(′?`)┌uo;關(guān)??鍵字時(shí)

1)阻塞了當前異步方法并立即將控制權轉交給調用者主函數Main

2)主函數獲得控制權后繼續執行方法體內步驟2,GetRes??ultAsync方法則異步執行(等待異步操作結束之后執行步驟4)。

場(chǎng)景3:異步方法體內遇到await之后,立即將控制權轉到調用者手中,調用者需等待異步方法返回結果

static void Main(string[] args)
{
Console.Wri??teLine??("執行前Main.....線(xiàn)程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步驟①
Task<int> res = GetResultAsy??nc();
Console.WriteLine("執行結束Main....線(xiàn)程ID:" + Thread.CurrentThread.ManagedThreadI??d.ToString());//步驟②
Console.WriteLine("執行結果:" + res.Result + "....線(xiàn)程ID:" + Thread.CurrentThread.ManagedThreadId.ToString()??);//步驟③
Console.ReadKey();
}
async static Task<int> GetResultAsyヽ(′ー`)ノnc()
{
Console.WriteLine("執行前GetResult.....( ?ヮ?)線(xiàn)程ID:" + Thread.CurrentThread.ManagedThrea(/ω\)dId.ToString());//步驟④
await Task.Dela??y(??3000);
Console.WriteLine("執行結束GetResult.....線(xiàn)程ID:" + Thread.CurrentT??hread.ManagedThreadId.ToString());//步驟⑤
re(′;ω;`)turn 10;
}

執行結果:步驟① ——>步驟④—&m??dash;>步驟②——>步驟⑤——>步驟③

結果分析:

我們會(huì )發(fā)現,主函數Main調用異步方法GetResultAsync,(′▽?zhuān)?在遇到( ?° ?? ?°)異步方法中“awai??t”關(guān)鍵(jian)字時(shí)

1)阻塞了當前異步方法并立即將控制權轉交給調(diao)用者主函數Main

2)主函數獲得控制權后繼續執行方法體內步驟2和步驟3,GetResultAsync方法則異步執行。

3)當主函數執行步驟3時(shí),由于步驟3需要打印異步方法的返回結果,故ヽ(′?`)ノ需要等待異步方法結束才能繼續。所以需??先執行步驟5,然后再繼續執行步驟3。

最后,異步編程的時(shí)候我們通常會(huì )結合Task來(lái)使用

到此這篇關(guān)于A(yíng)SP.Net中的async+await異步編程的實(shí)現的文章就介紹到這了,更多相關(guān)ASP.Net async+await異步編程??內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)ヽ(′ー`)ノ文章希望大??家以后多多支持腳本之家!

來(lái)源:腳本之家

鏈接:https://www.jb51.net/article/193915.htm


推薦閱讀

亚洲女同成aV人片在线观看|亚洲www啪成人一区二区麻豆|亚洲国产中日韩精品综合|亚洲国产成人精品一级片|亚洲无码在线视频免费

亚洲女同成aV人片在线观看|亚洲www啪成人一区二区麻豆|亚洲国产中日韩精品综合|亚洲国产成人精品一级片|亚洲无码在线视频免费 健康| 弥渡县| 普兰店市| 苗栗县| 凯里市| 阳东县| 平阳县| 汉沽区| 深圳市| 湖州市| 马关县| 虞城县| 乌鲁木齐市| 开阳县| 龙岩市| 通江县| 石楼县| 海阳市| 思南县| 疏勒县| 高阳县| 克东县| 东阳市| 宜丰县| 邵阳县| 南川市| 略阳县| 社会| 东丽区| 伊宁县| 清水县| 康乐县| 旺苍县| 安阳市| 濮阳县| 大安市| 南通市| 西藏| 衡东县| 泰来县| 华蓥市| http://444 http://444 http://444 http://444 http://444 http://444