2007年10月25日木曜日

web上のファイルを受信する処理

フォルダ選択ダイアログは、不満はあるけど一応実装できた。ノート
不満点は
  1. やはり、ルートの名前とアイコンが取得できていないので適当に処理してしまった
  2. 指定したフォルダを選択した状態でダイアログを開く処理が不完全
だが、使用上あまり重要でもないと思うので、あんまり深く追っかけないで次の課題に進む事にした

次の課題は画像ファイルをwebからダウンロードしてファイルに保存する処理。
今までは受信処理を非同期処理として複数個のファイルを同時にダウンロードするようにしていた。しかし受信に失敗しているファイルが幾つかあるようだったので、受信処理を見直すことにしてみた。

非同期処理は、HttpWebRequest.BeginGetResponse();を使って、非同期リクエストを発行してレスポンスをコールバック関数で処理する
非同期なので、レスポンスが帰る前に次の処理が実行できる。あらかじめ受信する必要のあるuriへのリクエストを発行しておけるので、リクエスト->レスポンス->リクエスト->レスポンス....と順番に処理をするよりも効率が良いはず。

ただし、リソースが限られるので大量のリクエストを発行することは出来ないので、同時に発行するリクエストを制限する必要があると思う。リクエスト数の制限はOSかフレームワークがやってくれるから気にしないで好きなだけBeginGetResponseを呼び出しても良い”と勝手に思っていたが受信失敗しているので、そうでもなさそう

また、レスポンス待ちで長時間処理が終了しないリクエストをkillする仕組みを用意しなければいけないので処理が煩雑になってしまった

そこで、ThreadPool.QueueUserWorkItem();を使って同期処理の受信関数を複数スレッド同時実行するようにしてみた。、ThreadPoolはシステムが同時に実行するスレッドを適当に管理してくれるもの(だと思う)

実験してみた結果は、ほとんどの受信リクエストが失敗するというひどい状態になってしまった。

結局今のところ、ファイルを一個づつ順番に同期処理でダウンロードするのが一番確実みたい。これだと、レスポンスの遅いuriがあると無駄に時間を費やしてしまうので効率が悪く気にいらない。他に解決策が見つからなければしかたが無いかもしれない

0 件のコメント: