[解決済み] Async awaitキーワードはContinueWith lambdaと同等か?
質問
私が Async await キーワードを正しく理解しているかどうか、どなたか親切な方に確認していただけないでしょうか。(CTPのバージョン3を使用しています)
A. それは即時リターンを作成し、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"));
どのように解決するのですか?
一般的な考え方は正しいです。メソッドの残りは、一種の継続にします。
は
"ファストパス" ブログの記事
には、どのように
async
/
await
コンパイラ変換が動作します。
相違点、頭から。
その
await
キーワードはまた、quot;scheduling context" という概念を利用します。スケジューリングコンテキストは
SynchronizationContext.Current
で、存在すれば
TaskScheduler.Current
. そして、スケジューリングされたコンテキストで継続が実行されます。ですから、より近い近似値としては
TaskScheduler.FromCurrentSynchronizationContext
を
ContinueWith
にフォールバックします。
TaskScheduler.Current
に戻る。
実際の
async
/
await
の実装はパターンマッチに基づいています; それはタスク以外のものを待ち受けることを可能にする "awaitable" パターンを使用します。例としては、WinRTの非同期APIや、以下のような特殊なメソッドなどがあります。
Yield
のような特別なメソッド、Rx observables、そして
GCに負担をかけない特殊なソケット待ち受け
. タスクは強力ですが、それだけがawaitablesではありません。
もう一つ細かい違いが思い浮かびます。もしawaitableがすでに完了しているのであれば、その時点で
async
メソッドは実際にはその時点では戻らず、同期的に継続します。つまり
TaskContinuationOptions.ExecuteSynchronously
を渡すようなものですが、スタック関連の問題はありません。
関連
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] 非同期アロー関数のシンタックス
-
[解決済み] 非同期Task<T>メソッドを同期的に実行するにはどうしたらいいですか?
-
[解決済み] async/await - タスクとvoidをいつ返すか?
-
[解決済み] 非同期関数+await+setTimeoutの組合せ
-
[解決済み] 複数のタスクにasync/awaitを使用する
-
[解決済み] Task.Runの正しい使い方とasync-awaitだけの使い方
-
[解決済み】非同期プログラミングとマルチスレッドの違いは何ですか?
-
[解決済み] この非同期メソッドは'await'演算子を持たないため、同期的に実行されます」という警告を気にする必要があるか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み] 2つのリストを結合する
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み] awaitとContinueWithの違い