■9714 / ) |
Re[11]: System.Timers.Timerでのイベント処理 |
□投稿者/ nbmyou (52回)-(2007/11/02(Fri) 16:58:14)
|
■No9706 (れい さん) に返信
詳細な回答、ありがとうございます。
>>また、XMLファイルが作成途中(例えば大容量のファイルで、監視フォルダへのコピーに時間がかかっている状態)ではないことの判断は、 >>拡張子がaaa(仮)の同名ファイルが同じフォルダに存在するかどうかで判断します。 > > これはダメな方向であろうと思います。 > ユーザーがaaaを作ってしまったらシステムが止まります。 > また、XMLファイルを作成するプロセスが途中で殺されて、aaaが残ってしまっても同様です。 > ファイルシステムで何かを保証しようと思ったら、 > ファイルの存在ではダメで、ファイルのロックを使うべきです。
XMLファイルを監視フォルダに作成する処理を行うのは、 他者が作成したプログラムです。こちらの実装を変えることはもうできないのですが、 何かいい方法は考えられますでしょうか。
なお、XMLの読み込みですが、現在XMLSerializerを使用しています。 XMLと同じ構成のクラスを作成するだけでいいので、簡単だったもので・・・。 (出力も入力も自分でやるのでなければ、XMLSerializerは良くないと、当サイトの別の質問で言われましたが、今のところ使い続けています) ここで読み取りに失敗すると例外の内容に関わらず10回までリトライし、あきらめるつくりにしています。
> 大体概要もわかったので、より詳細に私のお勧めを書いておきます。 どうもありがとうございます。 経験者の方の考えが聞けると、とてもいい経験になります。
> OnPauseやOnStopでは終了フラグや停止フラグを設定。 終了フラグ・停止フラグというのは、どういう事態を回避するためのものでしょうか。 (サービスが止まっても、ワーカスレッドは動いているということ?)
> 次に時刻の確認。 > 時刻が設定より過ぎていれば処理。そうでなければまたSleep。 時刻の確認とは、Windowsの時計を確認するということでしょうか。 例えばポーリング間隔が5分で、サービス開始時の時刻が17:00であった場合、 設定時刻を17:05分とし、Sleepから復帰する毎にWindowsの時計と設定時刻を見比べる・・・ という認識で合ってますでしょうか。 上記のような処理であれば、WIndowsの時刻が修正された場合のことを考えなければならなくなりそうですよね。
> 処理を行うファイルは「排他」ロックをかける。「共有」ロックではなく。 すみません。Googleで検索してみましたが、 C#でファイルのロックを取得する方法が見つけられません。 ヒントでも構いませんので、教えていただけませんでしょうか。
たびたび申し訳ありませんが、よろしくお願いいたします。
|
|