- - PR -
ネットワークの通信が切れた時のエラー処理
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-07-08 18:39
いつもお世話になっております。
鵜匠です。 C#にて、System.IO.File.Moveを使って、 異なるパソコン間でファイルをコピーする際、 コピー前に始めから通信が切れている際は、 System.IO.IOExceptionにてエラーをcatch出来ますが、 コピー中に通信が切れた場合、 画面がフリーズしてしまい、エラーを拾えません。 コピー中に通信が切れた際にエラーを拾う方法を ご存知の方がいらっしゃいましたら教えていただけないでしょうか? | ||||
|
投稿日時: 2008-07-08 19:04
それはただ単に時間がかかっているだけだと思います。 待っていればエラーに成ると思いますよ。 30分とか2時間とか。 それでは困るというなら、 コピーに時間制限を課すとよいでしょう。 その場合、サイズや転送レートなどを考慮して時間を決めたり、 いろいろ考えねばならないことは増えますが。 | ||||
|
投稿日時: 2008-07-09 09:23
れい さん
返信ありがとうございます。 そうなんですね。 いつも数分間待って、 これ以上固まってても運用に耐えられないと思い、 途中で終わらせていました。 差し支えなければ、 コピーの制限時間の課し方を教えていただけませんか? | ||||
|
投稿日時: 2008-07-09 12:00
タイムアウトつきFile#Existsの話題
File.Exists を別スレッド化する。 | ||||
|
投稿日時: 2008-07-09 12:02
いろいろな方法がありますが、 きちんとやろうとするとどれも結構大変です。 あきらめるのをオススメします。 それでも… というのであれば、別スレッドを作り、そのスレッドでコピーを行う方法がいいと思います。 別スレッドでは ソースファイルの存在確認、 ターゲットファイルの存在確認、 ソースファイルの属性取得、 データの読み込み、 データの書き込み ターゲットファイルの属性設定 などを順にこなします。 各ステップでキャンセルフラグが立っているか調べます。 立ってる場合は以降の処理を行わずに終了します。 メインスレッドはコピー開始時にコピースレッドに通知し、 スレッドにたいしてWaitOneなどで同期をとります。 WaitOneにタイムアウトを設定しておき、 タイムアウトになったらキャンセルフラグを立てます。 キャンセルフラグを立てたら、後は放置します。 Vista以降であればCancelIOが使えますので、 タイムアウト時にメインスレッドからCancelしたり、 データの取得を非同期にしておいてCancelするという手も使えます。 ただし、CancelIoにかかる時間は不定ですし、 ファイルシステムによってはCancelIoに対応していませんので、 すぐに処理がもどることは期待できません。 もう一つのオススメの方法は「コピーを別プロセスで行う」方法です。 コピーするだけのプログラムで、キャンセル時にはプロセスを殺すようにします。 タイムアウトは「一定時間たってプロセスが生きていたら殺す」という処理で可能です。 これだと、いろいろ細かいことを考えなくてもうまく行きますが、 少しシステム負荷が大きいです。 いずれにせよ、簡単ではありません。 | ||||
|
投稿日時: 2008-07-10 09:15
>かずくんさん
ありがとうございます。 参考にさせていただきます。 手法はひとつでは無さそうなので、 一番簡単な方法を選んでみたいと思います。 >れいさん ありがとうございます。 結構難しいのですか。 今回は、仕様上どうしても必用と言うわけではありませんが、 納期が少し延びたので、 どうせならしっかり作りこんで技術確立しておくのも良いかなと思いました。 とりあえず、後者の方法の方が作りやすそうなので、 そちらから試してみます。 対象のパソコンはVistaではないですので、 CancelIOも取れなさそうですし。 色々ご教授ありがとうございました。 |
1