【发布时间】:2021-10-17 17:35:02
【问题描述】:
以如下代码为例,watcher引发的事件都调用同一个方法:
[NonSerialized]
private FileSystemWatcher Watcher;
private void WatcherInit()
{
Watcher ??= new FileSystemWatcher();
Watcher.Path = Application.dataPath;
Watcher.Filter = "*.mat";
Watcher.IncludeSubdirectories = true;
Watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.CreationTime;
Watcher.EnableRaisingEvents = true;
Watcher.Changed += OnWatcherChanged;
Watcher.Created += OnWatcherCreated;
Watcher.Deleted += OnWatcherDeleted;
Watcher.Renamed += OnWatcherRenamed;
}
private void OnWatcherRenamed(object sender, RenamedEventArgs args)
{
DoViewReload();
}
private void OnWatcherDeleted(object sender, FileSystemEventArgs args)
{
DoViewReload();
}
private void OnWatcherCreated(object sender, FileSystemEventArgs args)
{
DoViewReload();
}
private void OnWatcherChanged(object sender, FileSystemEventArgs args)
{
DoViewReload();
}
这会导致同一个方法被多次调用,而我希望它只调用一次。
在我的例子中,我刷新了 UI,当我创建一个新文件时它发生了 3 次。
我想应该有一些计时器会等待连续的事件并将它们连接起来,然后只发出一个调用;这只是一个猜测,也许我不知道有更好的解决方案。
有什么想法吗?
【问题讨论】:
-
Watcher.Path = Application.dataPath;在这行代码上放一个断点。运行代码。断点命中多少次? -
您可能希望将事件合并为延迟,因为 FSW 经常在创建文件的程序仍在使用文件时引发事件
-
除了@CaiusJard 写的内容之外,您还可以通过从您的代码访问文件(上次访问时间更改)来获取已更改的事件。
-
@aybe 我想你忘了回答我的具体问题。此问题的一个非常常见的原因是订阅两次。我只是想确定你是否已经这样做了。
标签: c# design-patterns filesystemwatcher