現在SHFileOperationを使って定期的にファイルをコピーするプログラムを作成しており
ます。
このときに、共有フォルダを使って、いくつかのマシンからファイルを収集しているの
ですが、ネットワークの状態が頻繁に変化するため目的にファイルへアクセスしようと
するとしばらくSHFileOperationから処理が戻ってきません。
それがいくつも重なっているためかわかりませんが、そこでプログラムが固まってしま
います。
こういう場合、どの用に対処するのが正解なのでしょうか?
pingを打ってレスポンスが返ってくるか調べる等考えましたが、どうも今ひとつ良い方
法が見つかりません。
ネットワーク越しのやり取りについてはネットワーク状態が必ず絡むので
状況によっては固まったような状態(接続先からの応答待ち)になるのは
致し方ないと思います。例えば、ポーリングのような仕組みを作って
接続先の生存確認を行ったとしてもタイムアウトになるまでの間は
必ず待ち状態が入ります。タイムアウト時間が短いとちょっとネットワーク
状態が悪くなるだけでタイムアウトエラーになってしまうと思うので
むやみにタイムアウト時間を短くする訳にも行きませんし。
接続先の応答待ちに関しては特に打つ手は無いと思います。
ある意味、ネットワーク経由にした場合の仕様と言う事になると思います。
むしろネットワークの停滞が業務に直接影響するようであれば、
ネットワークの改善を考えた方が建設的ではと思います。
> そこでプログラムが固まってしまいます。
もしも「応答なし」になるとかであれば別スレッドで操作すると改善するかと。
少なくとも、pingを打つのは無駄打ちかと。
# 環境が完全に想定で切るならまだしも、
# 特定できないようだと最近のPCはpingに応答しない設定も増えてますし。
ちなみに、動作環境のOSはなんですか。
応答無しと出るのを阻止したいだけなら
Banさんが言われている通り、通信部分をメインスレッドから
切り出してワーカースレッドにでもすれば、応答無しと表示されるのは
避けられると私も思います。
ただ、応答待ちになっている場合に途中で終了させようとしても
ワーカースレッドが待ち状態になっているので直ぐ終われない状態に
なっているというのは避けられないでしょうし、何らかの操作を中断して
他の操作をしようとする場合にワーカースレッドを使いまわすのであれば、
応答待ちが終わるまで待機するしかないと言うのは仕方ないと思います。
まあ、要求だけをキューに積んでおいてオペレーションの方はできるように
組むのは可能だと思いますけれど、実質の作業が保留状態で積み上げられて
いくだけの話になるのでそれで嬉しいのか?と言う話もあると思います。