Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何刷新挂起的FileSystemWatcher事件?_C#_.net_Windows - Fatal编程技术网

C# 如何刷新挂起的FileSystemWatcher事件?

C# 如何刷新挂起的FileSystemWatcher事件?,c#,.net,windows,C#,.net,Windows,我需要确保在执行操作之前处理所有挂起的FileSystemWatcher事件。有什么方法可以做到这一点吗?FileSystemWatcher使用非分页内存中的缓冲区来存储文件系统事件。当您处理每个事件时,它将从此缓冲区中删除,从而为新事件释放空间 它不是一个可以无限增长的队列或列表。如果短时间内有许多事件,则会填充缓冲区,然后引发错误事件。所以你没有能力刷新这个缓冲区 如果希望在开始处理事件之前确保缓冲区为空,最简单的方法是创建一个新的FileSystemWatcher,并在需要它之前开始监视。

我需要确保在执行操作之前处理所有挂起的FileSystemWatcher事件。有什么方法可以做到这一点吗?

FileSystemWatcher使用非分页内存中的缓冲区来存储文件系统事件。当您处理每个事件时,它将从此缓冲区中删除,从而为新事件释放空间

它不是一个可以无限增长的队列或列表。如果短时间内有许多事件,则会填充缓冲区,然后引发错误事件。所以你没有能力刷新这个缓冲区


如果希望在开始处理事件之前确保缓冲区为空,最简单的方法是创建一个新的FileSystemWatcher,并在需要它之前开始监视。但是,您应该注意不要创建太多的同时监视程序,因为每个监视程序都依赖于将缓冲区存储在非分页内存中。

如果您正在监视一个文件,请打开它进行写入以锁定它,这样其他人就无法访问它,从而生成任何新事件。然后等待一毫秒左右。丑陋?是。

我的解决方案。。到目前为止看起来还不错

while (true)
{
    WaitForChangedResult res = watcher.WaitForChanged(WatcherChangeTypes.All, 1);
    if (res.TimedOut)
         break;
}

我知道这篇帖子很旧,但我只是这么做了……你差点就到了

您只需将临时文件写入正在监视的文件夹,然后等待获取创建的事件。在创建的事件中,您设置了一个标志,告知等待循环退出。您的临时文件将是通知队列中的最后一个,因此您知道它已刷新


如果有其他线程不断向关注的文件夹写入,则需要在执行此操作时阻止它们,以确保其完全刷新。

否,我正在关注文件夹的树。锁定不是一个选项。嗯。。watcher生成了第一个事件,我已经处理好了。。。下一步是什么?每次处理事件时,它都会从缓冲区中清除。这就是为什么建议尽快处理事件,以避免填充缓冲区。我需要知道缓冲区中是否有挂起的事件。如何使用?您无法使用FileSystemWatcher直接访问此缓冲区。最好将所有事件添加到您创建的集合(即字典或列表)中,然后当集合包含足够的事件时,处理它们。如果您想要更多,FileSystemWatcher不是合适的工具,请查看Windows API。我需要知道当前是否添加了所有挂起的事件。不使用WinAPI也可以吗?