程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 關於async和await的一些誤區實例詳解

關於async和await的一些誤區實例詳解

編輯:C#入門知識

關於async和await的一些誤區實例詳解。本站提示廣大學習愛好者:(關於async和await的一些誤區實例詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是關於async和await的一些誤區實例詳解正文


微軟官方的MSDN上說async和await是“異步”,然則很多人(包含筆者本身)都有一些誤區須要廓清:為何await語句以後沒有履行?不是異步嗎?

先舉一個示例代碼以下:

public partial class Form1 : Form
{
 public async Task Processing()
 {
   await Task.Delay(5000);
   label1.Text = "Succuessful";
 }
 public Form1()
 {
   InitializeComponent();
   
 }
 private async void button1_Click(object sender, EventArgs e)
 {
   await Processing();
   MessageBox.Show("Button's event completed");
 }
}

許多人(包含筆者)一開端會認為異步似乎相似多線程一樣,到await的時刻會在後台先開啟一個線程履行義務,隨後主線程(這裡是UI線程)將主動履行前面的部門(即彈出“Button's event completed”的新聞框)。

其實這個懂得是毛病的。async和await的實質實際上是“yield return”和“LINQ”的“迭代式”期待。我們應當清晰一點:那就是你寫了LINQ語句:

var results = from ……
       select ……;

foreach(var r in results)
{
 ……
}

當你下斷點你會覺察results其實不會立刻履行,直到應用到results的處所(例子中也就是foreach這裡)才會被履行(此時黃色跟蹤調試的光棒又會折回到var results……這裡,然後比及results履行終了以後才真正進入foreach停止履行)。

所以,async/await和LINQ的這類“迭代式”的“異步操作”是異曲同工的。只不外async/await實質是前往一個Task罷了,而Task又是異步的(由於Task實質就是一個線程),所以真正履行到(應用到async辦法的時刻)帶有await的辦法的時刻,後台才會真正開啟一個線程去履行義務。此時主線程會期待這個Task線程直到其履行終了(IsComplete屬性為True為止)。所以界面是不會卡頓的。

所以,await是Task的異步期待罷了,其實不是我們所謂的“異步操作”;拿它和LINQ尴尬刁難比,你會發明LINQ履行次序和它分歧,只不外LINQ沒有異步期待(固然沒有!又沒有開啟線程啥的……)。

我們進一步可以如許比較:

LINQ:變量 = LINQ語句(表達式)

   比及應用LINQ變量的時刻才折返到LINQ語句處真正履行LINQ語句。

異步期待:變量 = 異步辦法

    比及應用await+異步辦法的時刻才會折返到該異步辦法處,開啟線程真正履行異步辦法,主線程被掛起(但不會形成界面逝世失落),直至子線程Task義務完整履行終了為止。

在LINQ中,你假如須要立刻履行,可使用擴大辦法:

var results = (from ……
              select ……).ToList();
由於立刻應用到了這個LINQ語句,所以會被立刻履行。

異樣地,異步期待也能夠釀成相似Wait一樣的同步期待:

private async void button1_Click(object sender, EventArgs e)
{
  Processing().GetAwaiter().GetResult();
  MessageBox.Show("Button's event completed");
}

由於Processing原來就前往Task,固然也能夠應用Wait停止同步期待。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved