1

いくつかのグーグルをすることによって、私はそれが「ファイルシステムのアクションを追跡するために使用される」ことを知るようになりました。しかし、私はそれの有用性を理解していません、ウォッチャーはイベントを中間バッファーに保存せずに直接トリガーすることができます!!

イベントの非同期フロー(ファイルのコピー/変更)を同期イベント呼び出しに変換することはありますか?また、FileWatcherがイベントを非同期的にトリガーするかどうかもわかりません。

誰かがこれに光を当ててくれませんか?

4

4 に答える 4

2

あなたはあなたの質問でバッファのポイントを逃していると思います。

MSDNから、FileSystemWatcher (私の強調):

Windowsオペレーティングシステムは、FileSystemWatcherによって作成されたバッファ内のファイルの変更をコンポーネントに通知します。短時間に多くの変更がある場合、バッファがオーバーフローする可能性があります。これにより、コンポーネントはディレクトリ内の変更を追跡できなくなり、包括的な通知のみが提供されます。

したがって、まだ通知されていないイベントのバッファーではなく、ポーリングすることなく、最初に通知をサポートするためにWindowsに提供されるバッファーです。このインスタンスでWindowsが大量の操作をスローすると、このバッファーがオーバーフローし、FileSystemWatcherのコンシューマー/ユーザーであるユーザーは一部の通知を失います。

于 2010-02-02T09:01:32.433 に答える
1

FileSystemWatcherを機能させる基盤となるWindowsAPIは、ReadDirectoryChangesW()です。2番目の引数lpBufferに注意してください。これは、InternalBufferSizeプロパティでサイズを設定できる内部バッファーとの1対1の一致です。

Windowsはディレクトリの変更に応じてユーザーコードを簡単に実行できないため、バッファが必要です。これらの変更は、それぞれのファイルシステムドライバによって検出され、カーネルモードで実行されます。ユーザーモードコードを実行するには、高価なモードスイッチとスレッドコンテキストスイッチが必要です。これは、検出された個々の変更ごとに実行するにはコストがかかりすぎます。バッファは変更を収集するためにあり、ユーザーモードコードが実行を開始してバッファを空にするのを待ちます。

FSWには十分に文書化された障害モードがあり、変更が多すぎて追いつけない可能性があります。マネージコードにErrorイベントが表示されます。バッファサイズを増やすと、多くの場合、デフォルトのバッファは4096バイトとかなり小さくなります。ただし、任意に大きくすることはお勧めできません。カーネルにはバッファスペースも必要であり、それはカーネルのメモリプールから取得されます。これは限られたリソースであり、プールから大量にゴブリングすると、マシンで実行されているすべてのプログラムに影響します。

于 2010-02-02T13:37:33.497 に答える
1

filewatcherは、すべてを一度に処理できない場合、リクエストをバッファリングする必要があります。これは主に、FileSystemwatcherがスローするイベントに反応するために作成したコードが原因です。私の知る限り、FileSystemWatcherイベントは非同期ではありませんが、イベントでスレッドを生成して、コードの処理を非同期にすることができます。もちろん、ファイルシステムは、すべてのファイルを削除したり、コピー&ペーストを考えたりするなど、一度に複数のファイルを変更できます。

それが明確だったと思います。

于 2010-02-02T08:58:43.247 に答える
0

はい、FileSystemWatcherは、ファイルシステムの変更を追跡するために使用されます。ディレクトリを監視し、ディレクトリ内のすべてのファイルに次の変更を報告します。

  • OnCreated:ファイルまたはディレクトリが作成されたときに呼び出されます
  • OnChanged:ファイルまたはディレクトリが変更されたときに呼び出されます
  • OnRenamed:ファイルまたはディレクトリの名前が変更されたときに呼び出されます
  • OnDeleted:ファイルまたはディレクトリが削除されたときに呼び出されます

「内部バッファ」は、オペレーティングシステムがFileSystemWatcherに情報を送信する方法です。そのサイズは「InternalBufferSize」プロパティによって制御されます。

一度に多くの変更が発生すると、内部バッファがいっぱいになる可能性があります。次に、すべての個別の変更を取得する代わりに、単一の変更通知を取得します。

  • OnError:バッファオーバーフローが原因で個々の変更が失われたときに呼び出されます

FileSystemWatcherは、イベントを非同期的にトリガーします。具体的には、ファイルが変更されるたびにイベントがトリガーされます。

于 2010-02-02T09:15:59.420 に答える