【问题标题】:How to prevent two different windows services accessing the same file in runtime?如何防止两个不同的 Windows 服务在运行时访问同一个文件?
【发布时间】:2014-08-07 09:00:27
【问题描述】:

我有两个 Windows 服务。一项服务将文件从 ftp 移动到包含子目录的目录中。另一个服务从这些目录中读取这些文件并执行一些需要很长时间的工作。当两个服务正在工作时,如何防止两个不同的服务访问同一个文件?谢谢。

【问题讨论】:

    标签: .net windows service process


    【解决方案1】:

    如果您需要同步这两个服务,您应该有某种方式在它们之间进行通信

    如果您不想被 IPC消息队列web-services 等过于“复杂”的基础架构所困扰,您可以使用简单的文件:

    • 当第一个服务完成从 FTP 移动文件时,比如 "someDataFile.csv",它可以创建一个特殊的元数据文件,比如 ".process_someDataFile.csv",或者带有 GUID 的名称并且目标文件名保存在里面

    • 要知道是否有事情要做,第二个服务将通过 polling(我认为更可靠)或通过使用 @ 注册文件夹中的更改来检查这些特殊文件987654323@

    • 找到后处理目标文件,完成后删除元数据文件".process_someDataFile.csv"

    • 这是安全的,因为如果处理崩溃第二个服务,重新启动服务时会注意到,通过查看元数据文件,它还有一些工作要做

    • 在最坏的情况下,它会重新触发已经完成的工作,但这应该很容易在专用文件中保留对已经完成的工作的另一个跟踪

    【讨论】:

      【解决方案2】:

      您可以使用Mutex 来同步服务。

      Mutex mutex = new Mutex(true, "{Some unique Identifier here}");
      

      合适的标识符是Guid。您使用 Visual Studio 附带的guidgen.exe 创建一个。

      然后你的文件访问是这样的:

      mutex.WaitOne(timeout, true);
      
      // File access
      
      mutex.ReleaseMutex();
      

      这甚至可以跨不同的进程工作,因为互斥锁是在系统范围内创建的。

      如果您的服务之一没有释放互斥锁,超时将防止可能的死锁。

      编辑:

      请注意,使用互斥锁是跨机器兼容的。

      【讨论】:

      • 互斥锁的问题是它用于同步单个资源,在这里我们可以在给定时间处理多个文件,锁定整个文件夹树可能会阻碍处理:当第一个服务正在写入文件“CRMDataFile.csv”第二个服务必须能够在“HRDataFile.csv”上工作。
      • 这只会在您必须经常复制文件时阻碍处理。其次,如果服务不在同一台机器上运行,Mutex 将不起作用。它完全取决于程序的要求。但我同意你的观点,你的解决方案更好,但实施起来也更复杂。
      • 感谢您提及跨机限制,始终牢记在心。 :)
      • 我在看到您的跨机兼容解决方案后才注意到这个问题:D。我相应地改变了我的答案。
      • 两个服务在不同机器怎么办?
      猜你喜欢
      • 2022-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多