У меня есть следующий код, который регистрирует FileSystemWatcher
, а затем запускает некоторый метод. DoRequiedWork()
Всякий раз, когда в указанном файле происходит событие записи. Существует также определенная логика там, чтобы предотвратить множественные события от стрельбы по каждой записи (с lastRead
и lastWriteTime
):Улучшение производительности 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;
}
Я хотел бы реализовать это с помощью c++
апи ReadDirectoryChangesW
в попытке улучшить производительность, но я Я не знаю, как это сделать.
Я проверил 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);
}
Как я получаю чувство это может быть не лучший способ открыть приложение, но я не уверен.
Может ли кто-нибудь посоветовать?
[ 'FileSystemWatcher' УЖЕ использует' ReadDirectoryChanges'] (http://referencesource.microsoft.com/#System/services/io/system/io/FileSystemWatcher.cs), так что вы вряд ли улучшить положение вещей делая это самостоятельно. –
Во время разработки .NET Core 1.0 Microsoft выявляет несколько проблем производительности в этой области. Вам придется подождать, пока они приземлится на платформе .NET Framework, или вы разработаете RTM-приложение .NET Core 1.0 прямо сейчас. –
@MatthewWatson, который не является 100% истинным, если у Microsoft есть ошибки в этом классе. –