摘要:async

  • 893
  • 0

摘要:async

第一、當一般的Method、Lambda Expression與Anonymous Method是非同步時,必須透過async修飾函式定義的名稱。

第二、當程式碼在async method內依序執行時,在遇到await之後,若是桌面程式,UI Thread會等待await之後的非同步方法的傳回值,若是Web程式,負責接手處理await之後的非同步方法的傳回值的執行緒已經不是原本呼叫await之後的非同步方法的執行緒。[2]

第三、倘若被async修飾的方法內部並無await,會出現錯誤訊息:CS4014。

第四、async的使用方法視情境而定。用以修飾一般的method、lambda expression與anonymous method時,async是key word,負責指出前述的函式內部有一個或者以上的await。在其他的情況下,則是identifier,例如透過'@' 字元作為前置詞,則key word就會變成identifier。[3]

第五、async method的傳回值包含Task、Task<TResult>與void。

第六、async method的參數不可以包含ref與out。

第七、ref意指call by reference[4]。

第八、out的使用情境有二:其一是與ref相同,都是call by reference,但是除了函式定義的參數必須透過out宣告之外,呼叫函式的參數也必須以out宣告,但是不必在呼叫函式前對out修飾的參數初始化,反而可以在函式定義內部初始化。其二是用以修飾泛型參數,out關鍵字用以指出型別參數是covariant。out可以用在generic type與delegate。

第九、Assignment compatibility:可以將依據型別一建立的物件指定給依據型別二宣告的物件變數。Covariance:當型別一是型別二的衍生類別時,assignment compatibility依舊適用。Controvariance:當型別一是型別二基底類別時,assignment compatibility會被反轉。[7]

第十、單獨僅有ref或者out差異的函式不支援overloading。

第十一、在同步方法中,若無傳回值,相當於非同步方法的傳回值Task。在同步方法中,若有傳回值TResult,相當於非同步方法的傳回值Task<TResult>。

第十二、當非同步方法透過void宣告無傳回值時,通常用於事件處理機制。而且既不能使用await,也無法捕捉非同步方法拋出的例外。

 

 

參考資料來源:

[1]async (C# Reference)
http://msdn.microsoft.com/en-us/library/hh156513.aspx

[2]A Programmer's guide to C# 5.0 /Eric Gunnerson.
http://www.amazon.com/Programmers-Guide-Experts-Voice-NET/dp/143024593X/ref=sr_1_1?s=books&ie=UTF8&qid=1402981389&sr=1-1&keywords=A+Programmer%27s+guide+to+C%23+5.0+%2FEric+Gunnerson.

[3]2.4.2 Identifiers
http://msdn.microsoft.com/en-us/library/aa664670(v=vs.71).aspx

[4]ref (C# Reference)
http://msdn.microsoft.com/en-us/library/14akc2c7.aspx

[5]out (C# Reference)
http://msdn.microsoft.com/en-us/library/t3c3bfhx.aspx

[6]out parameter modifier (C# Reference)
http://msdn.microsoft.com/en-us/library/ee332485.aspx

[7]out (Generic Modifier) (C# Reference)
http://msdn.microsoft.com/en-us/library/dd469487.aspx

 

補充資料來源:

[1]Asynchronous Programming with Async and Await (C# and Visual Basic)
http://msdn.microsoft.com/en-us/library/hh191443.aspx

[2]Compiler Warning (level 1) CS4014
http://msdn.microsoft.com/en-us/library/hh873131.aspx

[3]Async Return Types (C# and Visual Basic)
http://msdn.microsoft.com/en-us/library/hh524395.aspx