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 になる。