C# 如何刷新挂起的FileSystemWatcher事件?
我需要确保在执行操作之前处理所有挂起的FileSystemWatcher事件。有什么方法可以做到这一点吗?FileSystemWatcher使用非分页内存中的缓冲区来存储文件系统事件。当您处理每个事件时,它将从此缓冲区中删除,从而为新事件释放空间 它不是一个可以无限增长的队列或列表。如果短时间内有许多事件,则会填充缓冲区,然后引发错误事件。所以你没有能力刷新这个缓冲区C# 如何刷新挂起的FileSystemWatcher事件?,c#,.net,windows,C#,.net,Windows,我需要确保在执行操作之前处理所有挂起的FileSystemWatcher事件。有什么方法可以做到这一点吗?FileSystemWatcher使用非分页内存中的缓冲区来存储文件系统事件。当您处理每个事件时,它将从此缓冲区中删除,从而为新事件释放空间 它不是一个可以无限增长的队列或列表。如果短时间内有许多事件,则会填充缓冲区,然后引发错误事件。所以你没有能力刷新这个缓冲区 如果希望在开始处理事件之前确保缓冲区为空,最简单的方法是创建一个新的FileSystemWatcher,并在需要它之前开始监视。
如果希望在开始处理事件之前确保缓冲区为空,最简单的方法是创建一个新的FileSystemWatcher,并在需要它之前开始监视。但是,您应该注意不要创建太多的同时监视程序,因为每个监视程序都依赖于将缓冲区存储在非分页内存中。如果您正在监视一个文件,请打开它进行写入以锁定它,这样其他人就无法访问它,从而生成任何新事件。然后等待一毫秒左右。丑陋?是。我的解决方案。。到目前为止看起来还不错
while (true)
{
WaitForChangedResult res = watcher.WaitForChanged(WatcherChangeTypes.All, 1);
if (res.TimedOut)
break;
}
我知道这篇帖子很旧,但我只是这么做了……你差点就到了 您只需将临时文件写入正在监视的文件夹,然后等待获取创建的事件。在创建的事件中,您设置了一个标志,告知等待循环退出。您的临时文件将是通知队列中的最后一个,因此您知道它已刷新
如果有其他线程不断向关注的文件夹写入,则需要在执行此操作时阻止它们,以确保其完全刷新。否,我正在关注文件夹的树。锁定不是一个选项。嗯。。watcher生成了第一个事件,我已经处理好了。。。下一步是什么?每次处理事件时,它都会从缓冲区中清除。这就是为什么建议尽快处理事件,以避免填充缓冲区。我需要知道缓冲区中是否有挂起的事件。如何使用?您无法使用FileSystemWatcher直接访问此缓冲区。最好将所有事件添加到您创建的集合(即字典或列表)中,然后当集合包含足够的事件时,处理它们。如果您想要更多,FileSystemWatcher不是合适的工具,请查看Windows API。我需要知道当前是否添加了所有挂起的事件。不使用WinAPI也可以吗?