溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么在ASP.Net中利用async+await實(shí)現(xiàn)異步編程

發(fā)布時(shí)間:2021-01-16 09:58:25 來源:億速云 閱讀:289 作者:Leah 欄目:開發(fā)技術(shù)

本篇文章給大家分享的是有關(guān)怎么在ASP.Net中利用async+await實(shí)現(xiàn)異步編程,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

在.NET Framework4.5框架、C#5.0語法中,通過async和await兩個(gè)關(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;
}

要點(diǎn)?。。?/p>

1.“async”用來標(biāo)記一個(gè)方法為異步方法,異步方法體內(nèi)需結(jié)合“await”關(guān)鍵字使用,如果沒有await,則該方法等同于一個(gè)普通方法。異步方法命名規(guī)則通常以Async結(jié)尾。

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

3.當(dāng)在async異步方法中遇到await操作時(shí),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é)果:步驟① ——>步驟③——>步驟④——>步驟②

怎么在ASP.Net中利用async+await實(shí)現(xiàn)異步編程

結(jié)果分析:

我們會發(fā)現(xiàn),主函數(shù)Main調(diào)用異步方法GetResultAsync時(shí),由于異步方法缺少“await”關(guān)鍵字,主函數(shù)需等異步方法步驟3,4全部執(zhí)行結(jié)束后再繼續(xù)執(zhí)行步驟2,執(zhí)行順序完全和同步方法執(zhí)行順序一致;

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

怎么在ASP.Net中利用async+await實(shí)現(xià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é)果:步驟① ——>步驟③——>步驟②——>步驟④

怎么在ASP.Net中利用async+await實(shí)現(xiàn)異步編程

結(jié)果分析:

我們會發(fā)現(xiàn),主函數(shù)Main調(diào)用異步方法GetResultAsync,在遇到異步方法中“await”關(guān)鍵字時(shí)

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é)果:步驟① ——>步驟④——>步驟②——>步驟⑤——>步驟③

怎么在ASP.Net中利用async+await實(shí)現(xiàn)異步編程

結(jié)果分析:

我們會發(fā)現(xiàn),主函數(shù)Main調(diào)用異步方法GetResultAsync,在遇到異步方法中“await”關(guān)鍵字時(shí)

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時(shí),由于步驟3需要打印異步方法的返回結(jié)果,故需要等待異步方法結(jié)束才能繼續(xù)。所以需先執(zhí)行步驟5,然后再繼續(xù)執(zhí)行步驟3。

最后,異步編程的時(shí)候我們通常會結(jié)合Task來使用

以上就是怎么在ASP.Net中利用async+await實(shí)現(xiàn)異步編程,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI