日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。5.0で追加された非同期プログラミングのための構文について説明します。アプリでは重要な要素です。50ms以上かかる可能性のあるAPIのほとんどが非同期として提供されています。これは、時間のかかる処理を、同期的に呼び出した場合にアプリケーションの応答が、止まってしまうという問題を起こさないためです。時間のかかる処理を同期的に行った場合のイメージを以下に示します。このような処理は、タブレットなどのタッチユーザーインターフェースではユーザーに非常にストレスになります。アプリでは避けるべき挙動になります。ここで、時間のかかる処理を非同期に行った場合のイメージを以下に示します。このような処理を簡単に実装できるようにC#5.0から導入されたasync修飾子とawait演算子について説明します。アプリでの非同期APIを使ったコード例を以下に示します。result;}このコードで使用しているasyncというメソッドの修飾子と、awaitという演算子について動作を説明します。async修飾子は、メソッド内でawait演算子を使用するということを明示するための修飾子です。この修飾子がないメソッドでは、await演算子を使った非同期処理は行えません。await演算子は、TaskクラスやIAsyncInfoインターフェースやIAsyncOperationWithProgressインターフェースなどの待機可能な値を受け取り、終了するまで待機します。await演算子による待機の特徴は、現在実行中のスレッドはブロックせずにバックグラウンドの処理の終了を待機して、バックグラウンドの処理が終わった時点で、現在実行中のスレッドで続きの処理を開始する点です。このため、ユーザーインターフェースを扱うスレッドからバックグランドで行う処理を実行し、結果を受け取りユーザーインターフェースにフィードバックするといった処理が簡単に行えるようになります。async修飾子・await演算子の記述例async修飾子とawait演算子の記述例をいくつか示します。戻り値がvoidのメソッド戻り値がvoidのメソッドにasync修飾子がついているケースです。これは、呼び出し側で待つことが出来ないため、完全に突き放しの処理になります。基本的にイベントハンドラに対して使用する以外で使用することはありません。...();}呼び出し側のコード例を以下に示します。呼び出すことは出来るが結果を待つことは出来ないFoo();戻り値がTaskのメソッド戻り値がTaskのメソッドにasync修飾子がついているケースです。これは、呼び出し側で終了を待機することが出来ます。...();}呼び出し側のコード例を以下に示します。Foo();戻り値がTaskのメソッド戻り値がTaskのメソッドにasync修飾子がついているケースです。これは、呼び出し側で終了を待機しつつ処理結果を受け取ることが出来ます。処理結果の型はT型になります。Taskのメソッドでは、メソッド内で返す値はTで指定した型の値を返すだけで自動的にTaskになるようにコンパイラが変換してくれます。呼び出し側のコード例を以下に示します。value;ラムダ式にasync修飾子を付けるケースasync修飾子はラムダ式にもつけることができます。コード例を以下に示します。action();処理中で使っているTask.Delayメソッドは、引数で渡した時間だけ待機するメソッドです。await演算子と組み合わせることで、スレッドをブロックすることなくスリープのような処理をおこなえます。foreachでawait演算子await演算子はTask型などの待機可能なものを返す式の前なら何処にでも記述可能です。そのため以下のような書き方も可能です。itemの処理を行う}待機可能なメソッドWinRTでは、待機可能なメソッドが大量に定義されています。そのメソッドは名前の末尾にAsyncがついています。そのため、メソッド名からawait可能か判断できます。すべてのメソッドが、その命名規約に従っているわけではないので、最終的には各メソッドのドキュメントかインテリセンスでに表示される”(待機可能)”という表示から判断してください。Taskの合成Taskクラスには、Taskを扱った非同期処理をまとめるメソッドが定義されています。これを使うことで複数の処理を平行して実行するといったことが可能になります。WhenAllメソッド引数で渡したTaskやTaskをすべて待機します。以下の3つのオーバーロードが定義されています。tasks);引数で渡したTaskが結果を返すものの場合、すべての結果をTaskという形で受け取ることが可能です。このメソッドを使うと、複数のサーバーからデータをダウンロードして全てのダウンロードが完了を待って処理を行うといったことが簡単に行えます。結果を受け取り処理を行うWhenAnyメソッドWhenAnyメソッドは、引数で渡したTaskやTaskの中から、どれかが完了するまで待機するメソッドです。メソッドには、結果を返すもの、返さないものを含めて以下の4つのオーバーロードが定義されています。tasks);このメソッドを使うことで、複数個所にアクセスして、一番早く応答を返した所の結果を使って続きの処理を行うといった処理が行えます。v2.9.0とv3.0.0-pre5をリリースしました。id:neueccさんがプルリクをくれました。C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。Blogの内容は個人の見解であり、所属する企業を代表するものではありません。)はてなブログをはじめよう!okazukiさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。