新しいWindows Runtime (WinRT)のゴールのひとつは、開発者によりよい非同期プログラミングの利用をサポートすることである。非同期操作は、(I/Oやネットワーク通信のような)他の操作が完了していなくても、プログラムが応答することができる。この応答性は、ユーザーがジェスチャーですぐに応答を期待しているタッチベースインターフェイスを含むほとんどのユーザーアプリケーションで有益である。
そのために、C#とVisual Basicプログラマが、彼らのプログラムのコントロールフローを複雑にすることなく非同期操作を可能にする“await/async”キーワードを使用することができる。非同期API呼び出しを行うプログラムフローは、呼び出したときの元の状態に応じて自動的に切り替えるようにコンパイラに任せることができる。MicrosoftのStephen Toub氏は先日、このプロセスがどのように動作するかを詳細に解説した。
コンパイラは、非同期とマークされたメソッドをステートマシンを使って内部的に書き換える。プログラマが“await”キーワードを使って宣言した場合コンパイラは、メソッドの実行をブロックしないようにサスペンドとレジュームが可能であることを知らせるマーカーを挿入することができる。
Toub氏によると:
非同期操作が完了せずに待ちに入ると、コンパイラが生成したコードが、ヒープに展開されているメソッドに関連づけられたすべての状態(たとえばローカル変数)をまとめて保存されます。その後、関数は呼び出し元に返り、他の処理が可能なようにスレッドをオンにします。待っていた非同期操作が完了すると、保存された状態を復元して、メソッドの実行が再開します。
Toub氏は、プログラマが“await”で提供されるものにさらなる管理性を求める状況に議論を移した。このケースでは、“AsTask”メソッドは、進捗状況の報告の提供か、複数の継続をサポートする必要があるのかもしれない。