[Task - 3] async 與 await

  • 29673
  • 0
  • C#
  • 2018-04-09

async 非同步

await 等待

 

常讓人搞不清楚的地方是

async + await => 程式跑跑跑、跑到一段要執行很久的、那我不如先去跑其他快的,再慢慢等原本那裡好了沒,好了我再回來繼續接著往下做

=> 其實是同一條 Thread

 

多個 Thread => 把慢的丟到另一個 Thread 跑,讓快的這條 Thread 不要被影響

=> 是兩條 Thread ( 你要自己管理 )

 

Parallel.For => 假設我要跑 100 條,我一次把 100 個灑出去

=> 但並不代表同時 New 了100 個出來,你只知道他有多條,實際到底有幾條是根據 cpu核心數、目前忙不忙....... 在程式跑的當下動態決定出來的 ( CLR 幫你管理 )

 

幾點注意事項

1. async 回傳型別必是 Task 或 void ( 通常 async 的函式會再 call 下一個 async 的函式 再 call 下一個 async 的函式.......... 而最初那一個的型別即為 void)

2. 通常被宣告成 async 的函式名稱,尾綴會加上 -Async

3. async 函式內至少有一個 await (下次恢復執行時的起點) ... 不加也可以 但那也就等於是傳統的同步方法的意思

4. await 後一定接一個 Task ( void 無法等 )

 

執行結果

 

程式碼

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication4
{
    /// <summary>
    /// 示範 Async 跟 Await
    /// tip: 關鍵字: wait系列, await, result, getResult 要等, 其他都不用
    /// </summary>
    class Program
    {
        public static void Main(string[] args)
        {
            RunAsync_1();
            Console.WriteLine("3");
            Console.Read();
        }

        static async Task RunAsync_1()
        {
            var run2 = RunAsync_2();
            Console.WriteLine("2");
            await run2;    //await 必接一個 Task (其後程式碼皆需等待)
            Console.WriteLine("5");
        }

        static async Task RunAsync_2()
        {
            Console.WriteLine("1");
            await Task.Delay(1000);  //要等
            Console.WriteLine("4");
        }
    }
}