サーバー負荷の観点から、説明したシナリオでリモート変更通知にIO.FileSystemWatcherを使用することは、おそらく最も効率的な方法です。これは、FindFirstChangeNotificationおよびReadDirectoryChangesW Win32 API 関数を内部的に使用し、最適化された方法でネットワーク リダイレクタと通信します (標準の Windows ネットワークを想定して: サード パーティのリダイレクタが使用され、必要な機能をサポートしていない場合、物事が勝ちます)。まったく機能しません)。.NET ラッパーは、非同期 I/O なども使用するため、最大限の効率が保証されます。
このソリューションの唯一の問題は、信頼性が低いことです。ネットワーク接続が一時的に切断されることに対処する必要があることを除けば (この場合、IO.FileSystemWatcher は処理可能なエラー イベントを発生させるため、それほど問題ではありません)、基礎となるメカニズムには特定の基本的な制限があります。Win32 API 関数の MSDN ドキュメントから:
つまり、負荷が高い場合 (大きなバッファが必要な場合)、またはさらに悪いことに、不特定のランダムな状況では、期待する通知が得られない可能性があります。これは、ローカル ファイル システム ウォッチャーの問題でもありますが、ネットワーク上ではより大きな問題です。SO に関する別の質問では、API に固有の信頼性の問題をもう少し詳しく説明しています。
ファイル システム ウォッチャーを使用する場合、アプリケーションはこれらの制限に対処できる必要があります。例えば:
探しているファイルにシーケンス番号がある場合は、通知を受けた最後のシーケンス番号を保存してください。これにより、今後の通知で「ギャップ」を探し、通知を受け取らなかったファイルを処理できます。
通知を受け取ったら、常に完全なディレクトリ スキャンを実行します。これは非常に悪いように聞こえるかもしれませんが、スキャンはイベント ドリブンであるため、ダム ポーリングよりもはるかに効率的です。また、1 つのディレクトリ内のファイルの総数と、スキャンするディレクトリの数を 1,000 程度以下に抑えている限り、この操作がパフォーマンスに与える影響はとにかく最小限に抑える必要があります。
複数のリスナーを設定することは、可能な限り避けるべきことです。どちらかといえば、これにより信頼性がさらに低下します...
とにかく、絶対にファイル システム ウォッチャーを使用する必要がある場合は、制限を認識している限り問題なく機能し、変更/作成されたすべてのファイルに対して 1 対 1 の通知を期待しないでください。
したがって、他のオプションがある場合 (基本的に、ファイルを書き込むプロセスが非ファイル システム ベースの方法で通知するようにします。通常の RPC メソッドは改善されます...)、それらは信頼性の点から検討する価値があります。ビューの。