1. 程式人生 > 程式設計 >C#關鍵字async/await用法

C#關鍵字async/await用法

經過一番的探索,終於搞清楚關鍵字async/await 在.net4.5之後可用的巧妙之處,在這裡記錄一下也與大家分享一下個人的心得體會

async:非同步執行

await:非同步執行中的等待其執行完(最大的優點是它是後臺等待,因此不阻塞GUI,介面互動非常的好)

使用async方法要定義async Task或者async Task<T> 最好不要定義async void方法來呼叫,async void是處理程式等,總結結論就是要使用async Task或者async Task<T>

使用asyn方法,可以用同步的格式,執行非同步的程式碼,如下:

int a = 0;
    private void button1_Click(object sender,EventArgs e)
    {
      Task.Run(()=> {
        Stopwatch sw = new Stopwatch();
        sw.Start();
        Thread.Sleep(2000);
        sw.Stop();
        SetText(textBox1,this,sw.ElapsedMilliseconds.ToString());
      });
      var eee=Ce_async();//前面接收值,這樣方法立即返回,主執行緒繼續執行
      //eee.IsCompleted
      textBox3.Text = "主執行緒繼續向下執行";


    }
    private async Task Ce_async()
    {
      await Task.Run(async ()=> {
        while (true)
        {
          await Task.Delay(100);//Thread.Sleep(2000);23           a += 1;
          SetText(textBox2,a.ToString());
        }
      });
    }



    private delegate void SetTextdelegate(Control cr,Form f,string str);
    private void SetText(Control cr,string str)
    {
      if (f.InvokeRequired) { f.Invoke(new SetTextdelegate(SetText),cr,f,str); }
      else { cr.Text = str; }
    }

正如上圖第11行註釋,使用接收值來接收async方法,該方法會立即返回值,主程式繼續向下執行,該方法後臺繼續跑。

那麼肯定有小夥伴與我當初有同樣的疑惑,這樣我執行用執行緒在這裡執行不也可以嗎?為什麼要用async關鍵字呢,他到底有什麼好處?

比如有一種情況:我的主執行緒如何有需要休眠等待的情況,那麼直接使用Thread.Sleep(),會使介面卡死,如果此時我將方法修改為async,那麼只需要await Task.Delay() 這樣也會等待時間完成後再向下執行,但是它不會使主介面處於假死狀態,如下:

private async void button1_Click(object sender,EventArgs e)
    {
      await Task.Delay(1000);
      var aaa=Task.Run(() =>
      {
        Stopwatch sw = new Stopwatch();
        sw.Start();
        Thread.Sleep(2000);
        sw.Stop();
        SetText(textBox1,sw.ElapsedMilliseconds.ToString());
      });
      var eee=Ce_async();//前面接收值,這樣方法立即返回,主執行緒繼續執行
      //eee.IsCompleted
      textBox3.Text = "主執行緒繼續向下執行";
    }

再次重複一點,在async方法中使用接收值來接收Task,會使得Task不必加上await關鍵字而被迫使得主執行緒需要等待它執行完才能向下執行,接收值的目的就是立即得到返回值

使用接收值來接收Task會直接返回,程式碼繼續向下執行,這一點很重要!!!

上圖的第3行,如下:

await Task.Delay(1000);

其中await只能用在非同步方法中,await會使得該執行緒等待await處的執行緒執行完,方可執行下方程式碼,正如該處程式碼所示,使用await Task.Delay(100); 代替 Thread.Sleep(100)

以上就是我們給大家整理的全部知識點,希望能夠幫助到大家。