【问题标题】:Windows Service with FileSystemWatcher stops after the first event带有 FileSystemWatcher 的 Windows 服务在第一个事件后停止
【发布时间】:2019-08-26 13:14:03
【问题描述】:

我正在构建一个简单的 Windows 服务(基本上结合了 this tutorialthis class)。

现在我有一个“FROM”目录和两个“TO”(TO1、TO2)目录。当我将文件放入 FROM 时,它应该同时复制到 TO1 和 TO2。我安装了该服务,并在我看到它正在运行的服务控制管理器中启动它。在第一次运行时,它将文件复制到 TO1 和 TO2,之后服务仍在运行。 然后,当我将另一个文件放入 FROM(使用不同的名称)时,什么也没有发生。并刷新服务我发现服务停止了。

为什么服务会停止?它似乎就在我放置第二个文件的那一刻停止了。

这里我注册了文件系统观察者:

    // File System Watcher
    var fileSystemWatcher = new FileSystemWatcher();
    fileSystemWatcher.Created += FileSystemWatcher_MoveOnCreate;
    fileSystemWatcher.Path = this.fromPath;
    fileSystemWatcher.EnableRaisingEvents = true;

这里是事件处理程序:

private void FileSystemWatcher_MoveOnCreate(object sender, FileSystemEventArgs e)
{
    string FROM = Path.Combine(fromPath, e.Name);
    string TO1 = Path.Combine(toPathOne, e.Name);
    string TO2 = Path.Combine(toPathTwo,  e.Name);

    File.Copy(FROM, TO1);
    File.Copy(FROM, TO2)
}

【问题讨论】:

  • sourceFile ?你的意思是 FROM 吗?
  • 请注意,文件系统事件的缓冲区有限。如果您的复制持续时间过长,您最终可能会丢失事件。我见过并使用的一种模式是将所有事件写入队列(快速),因此系统的缓冲区不会踢事件。

标签: c# .net windows-services filesystemwatcher


【解决方案1】:

如果 Windows 服务停止,则您的代码中某处存在未处理的异常。尝试用try{}catch(){} 包围代码的关键点(可能是函数FileSystemWatcher_MoveOnCreate 的整个主体)并记录发生的情况。一般来说,您应该将日志添加到您的 Windows 服务中,这是您了解事情是否正在发生的唯一方法。

【讨论】:

  • 感谢您的提示。在异常中它返回Exception: System.IO.IOException: The process cannot access the file 'C:\Users`...\FROM\test-file.txt',因为它正被另一个进程使用。我是否需要以某种方式释放 FROM 文件夹?
  • @TMOTTM 好吧,可能有很多事情,也许执行移动的过程还没有(还)释放文件?一些 await Task.Delay 可能会有所帮助,如果确实如此,也许添加一些重试逻辑将使程序更加健壮。
  • 有明确的发布方式吗?这些文件最多只有几 kB。
  • @TMOTTM 我认为问题不在于您的代码,而可能在于执行移动的其他代理。
  • @TOMTOM 我建议也注册 Changed Event。仅当 X 时间(例如 1 秒)没有更多更改事件时才开始复制。如果您将文件复制或移动到监视目录中,您会发现它首先被创建(使用 0 字节),然后是写入它的内容。因此,如果您仅在没有“死区时间”的情况下对 Created 事件采取行动,那么碰撞不仅是可能的,而且是可能的。在使用 fsw 时添加一些重试总是一个好主意。 (根据我的经验)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多