私はFileSystemWatcher
を登録し、いくつかのメソッドを実行する次のコードを持っていますDoRequiedWork()
指定されたファイルに対して書き込みイベントが発生するたびに。私は、パフォーマンスを改善するための試みでc++
API ReadDirectoryChangesW
を使ってこれを実装したいと思いますFileSystemWatcherのパフォーマンスを向上させる
// To prevent multiple events from firing
static DateTime lastRead = DateTime.MinValue;
static string UserName = GetUserName();
private static void Run()
{
// Create a new FileSystemWatcher and set its properties.
var watcher = new FileSystemWatcher
{
Path = [email protected]"\\file\home$\{UserName}\Application Data",
NotifyFilter =
NotifyFilters.LastWrite,
Filter = "filetowatch.txt"
};
// Activate
watcher.Changed += OnChanged;
watcher.EnableRaisingEvents = true;
while (true)
{
System.Threading.Thread.Sleep(10000);
}
}
private static void OnChanged(object source, FileSystemEventArgs e)
{
var lastWriteTime = File.GetLastWriteTime(e.FullPath);
if (lastWriteTime == lastRead) return;
DoRequiredWork();
lastRead = lastWriteTime;
}
、しかし:あり(lastRead
とlastWriteTime
で)各書き込みに発射から複数のイベントを防ぐために、そこにいくつかのロジックもありますこれを行う方法がわかりません。
私はpinvokeを確認し、署名のように定義することができることを見ることができます:私はこれを作成する方法を見て開始したいが、最初、これは実際に実行するかどうかをチェックしたいでしょう
[DllImport("kernel32.dll")]
static extern bool ReadDirectoryChangesW(IntPtr hDirectory, IntPtr lpBuffer,
uint nBufferLength, bool bWatchSubtree, uint dwNotifyFilter, out uint
lpBytesReturned, IntPtr lpOverlapped,
ReadDirectoryChangesDelegate lpCompletionRoutine);
標準よりも優れており、管理されているC#FileSystemWatcher
です。私は感覚を得るのよう
while (true)
{
System.Threading.Thread.Sleep(10000);
}
:
代わりに(またはそれに加えて)、私は(UIなしで)バックグラウンドで実行中のアプリケーションを維持するより良い方法がより存在しているかどうかを知りたいですこれはアプリを開いたままにする最良の方法ではないかもしれませんが、わかりません。
誰にでもアドバイスできますか?
(http://referencesource.microsoft.com/#System/services/io/system/io/FileSystemWatcher.cs)[ 'FileSystemWatcher'はすでに' ReadDirectoryChanges'を使用しています]ので、あなたは物事を改善する可能性は低いですあなた自身でそれをすることによって。 –
.NET Core 1.0の開発中、マイクロソフトはこの分野のパフォーマンスに関する複数の問題を特定しています。 .NET Frameworkでそれらを実装するまで待つか、.NET Core 1.0 RTMアプリケーションを開発する必要があります。 –
@MatthewWatsonこれはMicrosoftがこのクラスにバグを持っていれば100%真実ではありません。 –