Metro Style Appではwaitなどのブロックは継続をパラメータとしたtask::then中以外では禁止となっているようだ。とすると常に非同期を意識して処理しなければならない。初期化処理も同様である。私の場合初期化処理は時間がかかってもまあいいだろうとか思っていたけど、Metro Style Appではそういうわけにはいかないのだ。
例としてオーディオドライバ情報を列挙してUIに表示するコードを考える。私が考えるコードのフローは下記となる。
- オーディオ出力ドライバを列挙して出力ドライバ情報コンテナに格納する。
- ドライバ情報コンテナを列挙してAudio Clientアクティベートし、詳細情報を収集し出力ドライバ情報コンテナを収集する。
- ドライバ情報を出力ドライバ リストボックスに表示する。
- オーディオ入力ドライバを列挙して入力ドライバ情報コンテナに格納する。
- ドライバ情報コンテナを列挙してAudio Clientアクティベートし、詳細情報を収集し入力ドライバ情報コンテナを収集する。
- ドライバ情報を入力ドライバ リスト・ボックスに表示する。
Windows 7やDesktop Appでは1-6を上から下に流れるように作るだけだ。しかしMetro Style Appでは1,4が非同期処理となる。例だと1-3と4-6は非同期で実行できるし、そう書かねばならない。IAsync~をハンドルするコードを素直に書くとややこしく冗長なコードになるが、PPLでこれを書くと下記のように簡潔に書ける。
task<1の処理の結果の型>(1の処理).then(
【2-3の処理】
);
task<4の処理の結果の型>(4の処理).then(
【5-6の処理】
);
PPLを使えば同期処理に近い感じで書け、非同期処理はライブラリに隠されるので読みやすくなる。