IAsyncResult が返ってくるメソッドの非同期処理がよくわからんので調べてみた。

Compact Framework には WebClient がないので、WebRequestとWebResponseでダウンロード処理を書いてる途中、やっぱ非同期処理だろうと思っていろいろ調べるも、どうも腑に落ちなかった。

というわけで、非同期処理全般いろいろ調べてみると http://www.unisys.co.jp/club/net_view/20030115.html というページが非常にわかりやすかったので、もうすこしかみ砕いたのを自分用メモとして残しておく。サンプルのソースは上記ページを参照。

非同期呼び出しの開始

・Begin〜のメソッドを呼び出す

非同期呼び出しの終了待ち

方法は4つ。

1.コールバックを使う

Begin〜の引数にデリゲートを指定すると、非同期メソッドの処理が終了したときにそのデリゲートを実行してもらえる。

戻り値を取得する場合は End〜 のメソッドで取得できる。

2.Begin呼んだ後地道にポーリングする

Begin〜の戻り値の IAsyncResult.IsCompleted プロパティが true になるまでループなどをして待つ。

戻り値を取得する場合は End〜 のメソッドで取得できる。

3.End〜のメソッドを呼び出

End〜 を実行すると、非同期メソッドの処理が完了するまで処理が止まる。

Begin〜呼んだ後、End〜をすぐに呼んだ場合、同期メソッドを呼ぶのと同じ動きになる。

4.AsyncWaitHandleを使う

Begin〜の戻り値の IAsyncResult.AsyncWaitHandle プロパティにあるメソッド「WaitOne」を使って待つ。

引数でタイムアウトを指定できる。タイムアウトしたら戻り値は false になる。