【问题标题】:FileWatcher in Windows Service suddenly stops workingWindows 服务中的 FileWatcher 突然停止工作
【发布时间】:2012-06-14 19:33:16
【问题描述】:

我在 Windows 2003 中运行 Windows 服务。上个月我每天都在向它添加/更改代码,上个月我的文件观察器每天都在工作。但是,由于某些奇怪的原因,它今天停止工作。如果我恢复到旧代码,它仍然不会引发事件。我已经在我的 Win7 机器上测试了相同的代码,它工作正常。我假设有外部进程干扰,但我什至不确定要查找什么。

以下是相关代码:

private void InitializeComponent()
    {
        this.processfileWatcher = new System.IO.FileSystemWatcher();
        ((System.ComponentModel.ISupportInitialize) (this.processfileWatcher)).BeginInit();
        this.processfileWatcher.EnableRaisingEvents = true;
        this.processfileWatcher.Filter = "done.txt";
        this.processfileWatcher.Changed += new System.IO.FileSystemEventHandler(this.processfileWatcher_Changed);
        this.ServiceName = "Service1";
        ((System.ComponentModel.ISupportInitialize)(this.processfileWatcher)).EndInit();

    }

private void processfileWatcher_Changed(object sender, System.IO.FileSystemEventArgs e)
    {
        try
        {
            processfileWatcher.EnableRaisingEvents = false;
            //Do stuff here
            Debug.WriteLine(" End of processfileWatcher for: " + e.FullPath);
        }

        finally
        {
            processfileWatcher.EnableRaisingEvents = true;
        }

    }

通过调试语句,我可以确认我的 onStart() 方法已经结束。

【问题讨论】:

  • 您在哪里设置 FileSystemWatcher 的 Path 属性?
  • 在类的构造函数中使用 /onstart/onstop 方法: public Ex() { Settings = new Settings();初始化组件(); processfileWatcher.Path = Settings.ProcessFolder; }
  • 我不知道为什么它不适合你,但这里有一些通用代码建议:1)你不需要将你的 FileSystemWatcher 转换为 FileSystemWatcher 2 ) 在初始化代码中设置 Path 字段可能是个好主意。
  • 在您的 OnStart 中放置一个 Debugger.Launch,然后您可以附加调试器并遍历代码。您可能会看到某些行未命中或被吞没的异常。
  • Debugger.Launch 正在使我的服务崩溃...我错过了什么吗?

标签: c# service filesystemwatcher


【解决方案1】:

如果某些东西导致大量磁盘快速更改,则您可能在有机会捕获您正在寻找的东西之前就用完了缓冲区,或者您的服务凭据可能不适用于您正在监控的内容。

尝试授予显式权限,然后通过为 fileystemwatcher 的错误事件添加处理程序来查找缓冲区问题。

http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.error%28v=vs.100%29.aspx

【讨论】:

  • 谢谢,我会试试的。磁盘清理器正在运行并尝试压缩旧文件,因为我只剩下大约 35MB 的空间,但我确实关闭了该进程,因为我怀疑它可能会导致某些问题。明天早上我到办公室汇报时,我会首先尝试你的建议。谢谢!
  • 出于好奇,您最终发现了什么?
  • 我发现它一直在工作,但它没有输出调试语句,所以我认为它没有被触发。我开了一个新问题。
【解决方案2】:

尝试使用 this.processfileWatcher.Created 事件对其进行测试,看看在创建新文件时它是否仍会引发。 还可以尝试手动设置 NotifyFilter 属性 (doc) 看看是否可行。

【讨论】:

  • 我已将其更改为 Created 并选择了不同的目录,但我没有触发任何事件
  • 您是在看同一个目录还是将其更改为看网络驱动器之类的?还有一件事,您可以使用调试器通过调试附加到程序来调试您的 Windows 服务程序。见链接 [msdn.microsoft.com/en-us/library/7a50syb3%28v=vs.100%29.aspx]
  • 我正在尝试附加调试器,但它不会让我这样做,因为我正在使用混合的非托管/托管代码。我正在尝试将调试设置为托管,但在属性页窗口的配置属性下看不到任何调试选项。我发现文件监视程序现在被正确触发,但它不是通过其正常代码运行,而是启动一个在代码前面调用的 .exe 文件。我不确定为什么会这样。我什至在 filewatcher 的开头有调试语句,但调试视图上没有显示任何内容。 Exe 没有 filewatcher 方法。
  • 实际上让我更正一下。我做了更多测试,程序运行正常,但由于某种原因,在我启动 filewatcher 后,我的调试语句(System.Diagnostics.Debug.WriteLine)不会出现在调试视图中,除了来自exe。有没有其他人遇到过这个?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
相关资源
最近更新 更多