- - PR -
ファイル監視:FileSystemWatcherクラス....
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-07-10 02:39
私は、サービスえお作ったことがないのでよく分からないんですが、
これって本当ですか? while (watcher.Equels("")==true) ; をなくしても同じではないですか? どう見てもこの while に意味があるようには見えないんですが(^^; 「trueになることが無い」のであれば一度 false で評価されて 素通りするだけだと思いますが。 # でも検証したってことだし…? 私がサービスプログラムの動作を知らないのでなんともいえないんですが、 Main の最後で終了してしまうのであれば Jitta さんが書かれた方法が 自然だと思いますし、そもそもサービスは終了しないものなのであれば、 イベントだけ登録して後は何も要らないと思います。 あと、今回の話の本質とは全く関係ないですが、条件式で == true は 通常冗長です(なくていいです、あっても問題はありませんが)。 | ||||||||
|
投稿日時: 2003-07-10 02:47
ちなみにうまくいってるのは最初のとおりイベントを登録する物ですか?
それとも while 内で待つ方法ですか? # どちらにしてもそれぞれちょっと引っかかりますが。 | ||||||||
|
投稿日時: 2003-07-10 08:22
経緯を説明すると
FTPで送って来たファイルを監視するwindowsサービスを作ったのですが、 while(true);で永続化したらCPUが100%なってしまった。 それで、while(true);に変わる永続で待ち続ける方法を探してました。 *while無しだと監視が永続しない。一回で終ってしまうのです。
| ||||||||
|
投稿日時: 2003-07-10 09:16
ふにゃぁ? 『検証済み』というのは、「サービスを動かした。CPU消費は0。ファイル操作をするとイベント処理が動いた」ということでしょうか。残念ながら、それでは「動作の検証」にはなりますが、「ロジックの検証」にはなりません。
私の机上検証も同じです。「false」で評価されて素通り、つまりそこで待っているわけではない。一度デバッガで動きを追ってみてください。 (Mainの最初にsleep(適当に大きな値)を入れ、実行後、プロセスにアタッチする) 手元にある、以前作ったサービスプログラムを見ると、Main関数の最後に System.ServiceProcess.ServiceBase.Run(ServicesToRun) というのがありました。おそらく、こっちに入って冬眠しているのだと思いますよ。 私のプログラム: 定時間隔でUNIXにリモートシェルコマンドを発行する やっていること: コンストラクタでタイマイベントを設定 Main関数はさわらず イベントハンドラでリモートシェルを実行 | ||||||||
|
投稿日時: 2003-07-10 11:30
実のprogramは
@winサービスから何種類のファイルを監視プログラムスレッドを動かす。(FTPファイルをずっと監視する必要がある) AFTP受信したらEventをキャッチし、非同期でファイル分析スレッドを走らせファイルを分析しチェックファイル作成、結合、バックアップ処理を実行する。 wfcService ---->WatcherThread1-----> MergerThread catch ftp files ---->WatcherThread2 ”LOGに処理記録があるし、Aの処理が出来てましたので”と言うしかないが。。。。。 実のシステム開発ですので、これからも検証して行きたいと思います。 上の程度の動作確認は出来ましたが、 何でwhile (watcher.Equels("")==true) ; と言っても 開発に追われて理論的な根拠はあんまり考えないほうなので答えられなくて申し訳ございません。 いろいろありがとうございました。 | ||||||||
|
投稿日時: 2007-06-19 19:28
古い記事に対する返信、恐れ入ります。
ふぁんさんの環境や挙動はよくわかりませんが、VS2005におけるWindowsサービスの「FileSystemWatcher」利用は、特に考慮せずとも永続化が行われます。 「FileSystemWatcher」を調査していて紛らわしい内容でしたので、追記させて頂きました。 | ||||||||
|
投稿日時: 2007-06-19 19:48
WaitHandle 使うのが良いと思います
|