2009-06-29 7 views
1

私はNotepad ++やUltraEditに似たミニエディタコンポーネントを書いています。これはユーザーが開いているファイルを監視する必要があります。ちょっと粘り気ですが、必要なことです。Mulitple FileSystemWatchersは良いアイデアですか?

開いているファイルを監視するためにFileSystemWatcherの複数のインスタンスを使用することをお勧めします - メモ帳++やUltraEditのように、またはこれらを管理する方がいいですか?

文書が閉じられると、それらは適切に処理されます。

残念ながら、ドライブ用の汎用FileSystemWatcherを作成してそれを監視し、適切なファイルがわかってからファイルをリロードするメッセージを表示することをお勧めしますか?それとも、それが再試行されたのですか?

答えて

3

あなたは複数のFileSystemWatchersで問題に遭遇することはありません。実際にはこれを取り除く他の方法はありません。

パフォーマンスを向上させるため、狭いフィルタとして指定してください。

0

可能性のある使用例によって異なります。

ユーザーが同じディレクトリ内の複数のファイルを開き、他のファイルを変更しない場合、ファイルの数が多い場合、そのディレクトリの単一のウォッチャはファイルあたり1つよりも煩雑ではありません。

あなたが知る唯一の方法はベンチマークです。ファイルごとに1つずつ行うことは、ウォッチャーの寿命をはるかに簡単にします。そのため、最初のアプローチが必要です。ウォッチャーは、システムスレッドプール上でイベントを発生させるので、複数のウォッチャーが同時に起動することがあります(設計に影響を及ぼす可能性のあるもの)

私は確かにドライブごとにウォッチャーを行いません。積極的なフィルタリングでもそのように努力します。

2

FileSystemWatcherには欠点があり、監視フォルダをロックします。たとえば、リムーバブルストレージ上のファイルを見ている場合、「安全なデバイスの削除」ができません。

SHChangeNotifyRegisterでシェル通知を試すことができます。この場合、すべての変更に対して1つのエントリポイント(または複数の場合もあります)がありますが、この場合はネイティブシェルinteropが必要になります。

0

複数のウォッチャーを使用する必要がある場合は、それを使用しても問題ありません。 ShuggyCoUkのコメントによれば、すべてのファイルが同じフォルダにある場合、ファイルウォッチャーを1つにまとめることで最適化することができます。

もっと大きなフォルダ(ドライブのルートなど)にファイルウォッチャーを作成することはおそらく賢明ではありません。なぜなら、コードはファイルシステム内で起こっている他の変更から多くのイベントを処理する必要があり、コードがイベントを処理するのに十分速くない場合は、バッファオーバーフローに陥る可能性があります。

ファイルウォッチャーのもう一つの議論であるファイルシステムウォッチャーは、ネイティブオブジェクトであり、メモリーを確保します。したがって、アプリケーションの寿命とサイズに応じて、メモリの断片化の問題が発生する可能性があります。

ファイルを開くたびにコードが長時間(長時間または数日間)実行されます。データをメモリに格納し、ファイルウォッチャーをインスタンス化します。この一時的なデータはクリーンアップしますが、ファイルウォッチャーはまだそこにあります。CLRで移動できない複数のオブジェクトを仮想メモリに作成したばかりの場合、ファイルを閉じたり、ウォッチャーを破棄したりしないで、潜在的にメモリの輻輳に陥る可能性があります。周りにウォッチャーがいればこれは大したことではありませんが、数百人以上になる可能性がある場合は、それが大きな問題になることに注意してください。

関連する問題