読者です 読者をやめる 読者になる 読者になる

Windows8 Consumer PreviewからIAsyncInfo.Start()メソッドがなくなりました

Developer Preview から Consumer Preview へのアプリの移行の「Hot start async model」にも書いてあるのですが、IAsyncInfo.Start()メソッドがなくなりました。以前は、WinRTのAPIにたくさんあるXxxAsync()メソッドの戻り値、IAsyncOperationやIAsyncAction(IAsyncInfoを継承している)のStart()メソッドを呼ぶことで非同期処理がはじまるようになっていました。
たとえばファイルのリネームの場合StorageFile.RenameAsync(String)を使って、

IAsyncAction renameAction = fileStorage.RenameAsync("NEW_NAME.TXT");
renameAction.Completed += () => {/*リネーム完了をまって、何か処理。*/};
renameAction.Start();

上の場合だと、renameAction.Start()を呼ぶことで実際のリネームが始まるようになっていたわけです。
Start()を明示的に呼ぶのは、非同期処理を始める前にその完了をまつCompletedイベントプロパティをセットする必要があるからです。わたしは、まあそんなもんかな、くらいに思っていました。
でもWinRTは、上の例のファイルリネームですら同期版APIが無い、かたっぱしから非同期にする徹底ぶりなので、不便と思う人も多かったのでしょう。Consumer Previewから、IAsyncInfo.Start()メソッドがなくなりました。Start()を呼ぶ必要がなくなり、上の例だと、RenameAsync()を呼んだ時点でリネーム処理が始まるようになったのです。
これを全部のAPIで変えたのは、ある意味すごいですね。先に書いたとおり、WinRTのAPIはXxxAsync()だらけなわけですから。
それはそうとして、わたし的には、Start()が無くなったことより、これまでStart()前にセットしていたCompletedはいつセットすればいいことになったのかがとても気になりました。だって、非同期完了を待ち受けるはずのCompletedをセットする前に非同期が終わっちゃっている可能性が出てくるわけですから。
答えはこうだそうです。
曰く、Completedは、もしセットする前に非同期処理が終わってしまっていたとしても必ず呼ばれる。もしCompletedをセットしたときすでに非同期処理が終わっていたら、それを内部的にチェックしてCompletedを呼び出すし、そうでなければ通常の非同期イベントとしてCompletedが呼び出される、と。
ふむ、これを全部のAsyncメソッドでやったか。やっぱすごいな。
まあ、.Net FromsとかWPFとかSilverlightとかを次々に作っちゃう(そしてWinRTまで!)ことに比べたら小さいことですね。庶民には夢のようなことです。もう車輪の再発明どころの話ではないです。お金のある企業はやることが違うな。あっ話それた。