Task & Async/Await

關鍵字

  • Task : 是讓指定的Delegate 以另一個線程來執行.

  • async : 指定目標delegate 為存在非同步語法的方法,回傳值改變為Task & Task<T> (這裡不建議以void 作為回傳值(註1))

  • await : 等待目標排程結束

理解方法

  1. 遇到Task 時會另開線程與當下線程一起往下執行

  2. 遇到await 時程式會等待目標Task完成

  3. await Task.Run 為等待一個新開的排程

  4. 等待時不見得指有這個排程在執行 可能還有其他尚未進入等待的排程也在執行

  5. async 是 可以讓method 中的 await Task.Run 簡化成為 await 的method 關鍵字

  6. 從單一個排程的視角來看程式的運行流程仍然沒有改變 只是多了一個等待的通知繼續進行的狀態(如果看不懂那張複雜的圖的話)

  7. 需要圖輔助的話,可以以下面這張圖來做為參考

-------------------> 主線程時間軸
單線程
------------------->
非同步(非多線程同時進行)
----->|      |----->  中間為等待的時間 (用 await)
      |----->|        另一個排程開始運作並結束 (用Task)
多線程
------------------->  主線程於中途創造了兩個排程(用Task) 但並未等待任何一個排程
   |-------->         排程一執行結束
       |-------->     排程二執行結束
非同步與多線程交錯情境
----->|    |----->|   |-------> M  M建立T1,T3 並都於建立時等待 (用 await Task)
      |--->|                    T1 T1建立T2但沒有進行等待(用 Task)
        |-------|   |---->      T2 T2建立了T4但是並未立即進行等待進行等待(先用task 後面才await)
                  |-->|         T3 T3建立後運行結束
             |----->|           T4 T4建立後與T2一起運行 中途T2進入等待直到T4結束

使用方法

Last updated