【问题标题】:FileSystemWatcher Network DisconnectFileSystemWatcher 网络断开连接
【发布时间】:2014-12-13 02:30:08
【问题描述】:

我有一个 FileSystemWatcher 监视网络共享上的文件。如果发生导致共享不可用的事件,可能是由于网络问题,FileSystemWatcher 将断开连接。

显然我可以处理“错误”事件,也许做一些日志记录,很多文章建议在错误事件处理程序中重新连接 FSW。

但是如果网络共享在错误事件中仍然不可用怎么办。然后我需要引入一个计时器来测试网络共享是否可用并尝试重新连接 FSW。

1) 有没有更好的方法?

2) 是否有一个属性可以让我确定 FSW 已与文件断开连接?我注意到 FSW 有一个非公共成员“stopListening”,当 FSW 断开连接时,它似乎设置为 true。但这不是公开的

任何帮助将不胜感激......

谢谢 凯文

【问题讨论】:

  • 感谢 Erno 的回复,但不是。我知道我可以使用错误事件重新连接。但是当引发错误事件时,如果网络共享不可用会发生什么?除非我有某种计时器/定时尝试重新连接,否则我没有其他事件可以尝试重新连接!此外,FSW 不会公开公共属性来告诉我它已断开连接
  • 根据帖子我建议您可以使用一个错误事件。计时器是探测可用性的好主意。

标签: c# .net filesystemwatcher


【解决方案1】:

一些cmets和建议...(在我打字的过程中越来越多...对不起)

FileSystemWatcher.Error 事件在 FileSystemWatcher 收到太多事件发生得太快以至于无法处理所有事件时触发。它不会在查看文件系统时发生错误(例如网络掉线)时被触发。

我相信我也遇到过类似的情况。问题是当网络连接断开时,FileSystemWatcher 永远不会触发事件,因为它实际上看不到它应该观看的内容,但它似乎并没有意识到这一事实。当网络连接恢复时,FileSystemWatcher 不会恢复 - 即它仍然看不到(恢复的)连接。我们想出的唯一似乎可靠工作的解决方案是有一个计时器,它定期删除整个 FileSystemWatcher 对象并创建一个新对象,设置所有事件和监视文件夹等。因为删除并创建一个新 FileSystemWatcher 是(相对)快速(即毫秒),您可以将计时器设置为每 10 秒左右激活一次,而不会占用太多处理器。当然,如果网络仍然不可用,那么无论您做什么,FileSystemWatcher 都无法看到网络。不过没关系,它会在 10 秒后重试。

使用此解决方案需要注意两点:

  1. 当定时器激活时,它需要检查 FileSystemWatcher 当前没有处理任何事件,如果是则需要等待。因此,在计时器事件中,停止计时器,停止 FileSystemWatcher 引发事件,然后等待任何 FileSystemWatcher 事件完成(使用 lock (...) {...} 是这样做的好方法)。
  2. 删除并重新创建 FileSystemWatcher 后,您需要手动检查在刷新 FileSystemWatcher 时(或在网络关闭时)可能发生的任何事件。例如,如果您正在监视正在创建的文件,并且在刷新 FileSystemWatcher 或网络连接中断时创建了一个文件,那么当您启动 FileSystemWatcher 的新实例时,您将不会收到这些文件的事件 (因为文件已经创建)。

希望对你有帮助。

【讨论】:

  • 感谢马克的回复。重新阅读 MSDN 文档后,我发现您是正确的,当查看文件系统时发生错误时,错误事件实际上并没有被触发,这是我的一个误解。
  • 您的方法很有趣,但是(可能由于设计缺陷),FileSystemWatcher 实际上是高容量 WCF 服务中的静态。因此,必须每 10 秒重新初始化一次的概念对我们来说可能不是一个选择,即使是轻微的性能损失也可能对我们所需的响应时间造成代价高昂。听起来没有答案,因为我们不能完全依赖错误事件,最佳解决方案是重构我们的解决方案以删除 FileSystemWatcher,因为它似乎是一种不可靠的方法。
【解决方案2】:

在此跟进。根据 MSDN 论坛上 Microsoft 资源的建议,我将其添加到 Microsoft Connect。

微软反馈的要点: - 错误事件不仅适用于内部缓冲区溢出 - 他们会将 stopListening 属性添加到他们的客户建议列表中

链接:http://connect.microsoft.com/VisualStudio/feedback/details/727934/filesystemwatcher-error-handling

【讨论】:

  • 页面不再可用或无权查看 - 使答案一文不值:(
  • 链接仍然很糟糕,但也看不出这是对您问题的真正答案。
【解决方案3】:

这样的东西不可行吗?似乎适用于我的简单测试用例。

var fsw = new FileSystemWatcher("[folder]", "*.*") { IncludeSubdirectories = true};
var fsw_processing = false;
fsw.Deleted += (s, e) => 
{
    fsw_processing = true;
    fsw.EnableRaisingEvents = false;
    //......
    fsw.EnableRaisingEvents = true;
    fsw_processing = false;
};    
fsw.Changed += (s, e) => 
{
    fsw_processing = true;
    fsw.EnableRaisingEvents = false;
    //......
    fsw.EnableRaisingEvents = true;
    fsw_processing = false;
};    
//governor thread to check FileSystemWatcher is still connected. 
//It seems to disconnects on network outages etc.
Task.Run(() =>
{
    while (true)
    {
        if (fsw.EnableRaisingEvents == false && fsw_processing == false)
        {                        
            try
            {fsw.EnableRaisingEvents = true;}
            catch (Exception) { fsw.EnableRaisingEvents = false; }            
        }
        System.Threading.Thread.Sleep(1000 * 10);//sleep 10 secs
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    相关资源
    最近更新 更多