是否有人可以請客氣一點,以確認我是否已正確理解Async await關鍵字? (使用CTP的版本3)Async是否等待關鍵字等同於ContinueWith lambda?
到目前爲止,我已經計算出,在方法調用之前插入await關鍵字本質上做了2件事情,它創建了一個立即返回值和B.它創建了一個「continuation」在異步方法調用完成時調用。在任何情況下,延續都是該方法的代碼塊的其餘部分。
所以我想知道的是,這兩個代碼在技術上是否等價,如果是這樣,這是否基本上意味着await關鍵字與創建ContinueWith Lambda相同(即:它基本上是一個編譯器快捷方式) ?如果不是,有什麼區別?
bool Success =
await new POP3Connector(
"mail.server.com", txtUsername.Text, txtPassword.Text).Connect();
// At this point the method will return and following code will
// only be invoked when the operation is complete(?)
MessageBox.Show(Success ? "Logged In" : "Wrong password");
VS
(new POP3Connector(
"mail.server.com", txtUsername.Text, txtPassword.Text).Connect())
.ContinueWith((success) =>
MessageBox.Show(success.Result ? "Logged In" : "Wrong password"));
非常好說 - 我試着順從Jon的帖子,因爲它們比我有時間在SO上回答的任何東西都要廣泛得多,但是Stephen的說法絕對正確。 WRT什麼是等待(特別是GetAwaiter),他的帖子#3是非常有用的IMHO :) http://msmvps.com/blogs/jon_skeet/archive/2011/05/13/eduasync-part-3-the-shape- of-the-async-method-awaitable-boundary.aspx – 2012-01-07 16:06:37
Stephen在這裏。對於簡單的例子,很容易認爲異步/等待僅僅是ContinueWith的一個快捷方式 - 但是,我想反過來思考它。異步/等待實際上是您用來使用ContinueWith for的更強大的表達。問題是ContinueWith(...)使用lambda表達式,並允許執行轉移到繼續,但是如果必須將一半的循環體放在ContinueWith(..)之前,其他控制流概念(如循環)是不可能的。 )和另一半之後。您最終會手動繼續鏈接。 – 2012-01-07 21:19:52
另一個異步/等待比ContinueWith(...)更具表現力的例子是異常情況。您可以在同一個try塊中多次等待,並且對於每個執行階段,它們的異常可以集中到相同的catch(...)塊,而無需編寫大量明確執行的代碼。 – 2012-01-07 21:21:07