Async awaitキーワードが正しく理解されているかどうかを確認するのに十分親切にしてもらえますか? (CTPのバージョン3を使用して)Async awaitキーワードはContinueWith lambdaと同等ですか?
これまでのところ、メソッド呼び出しの前にawaitキーワードを挿入すると、基本的に2つのことが行われました。A.即時の戻り値とBを作成します。非同期メソッド呼び出しの完了時に呼び出されます。いずれにしても、継続はメソッドのコードブロックの残りの部分です。
私はこの2つのビットが技術的に同等であると思いますが、これは基本的に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"));
非常にうまくいっています - 私は、SOの回答に入れる時間があるものよりもはるかに広範であるため、ジョンの投稿に延期しようとしますが、スティーブンは絶対に正しいです。 WRTは何が待ち受けているか(特にGetAwaiter)、彼の投稿#3は非常に役に立ちますIMHO :) http://msmvps.com/blogs/jon_skeet/archive/2011/05/13/eduasync-part-3-the-shape- async-method-awaitable-boundary.aspx –
ここにスティーブンのスポットがあります。シンプルな例では、async/awaitがContinueWithのショートカットに過ぎないと考えるのは簡単ですが、逆の考え方が好きです。 Async/awaitは、実際にはContinueWithを使用するためのもののより強力な表現です。問題は、ContinueWith(...)がlambdasを使用しており、実行を継続に移すことができますが、ContinueWith(...の前にループ本体の半分を配置する必要がある場合はループなどの他の制御フローの概念は不可能です。 。)と残りの半分。手動連鎖連鎖で終わる。 –
async/awaitがContinueWith(...)よりはるかに表現的である別の例では、例外が流れています。同じtryブロック内で複数回待つことができます。実行の各段階で、例外を明示的に行うコードを書くことなく、例外を同じcatch(...)ブロックに集めることができます。 –