【发布时间】:2014-08-07 09:00:27
【问题描述】:
我有两个 Windows 服务。一项服务将文件从 ftp 移动到包含子目录的目录中。另一个服务从这些目录中读取这些文件并执行一些需要很长时间的工作。当两个服务正在工作时,如何防止两个不同的服务访问同一个文件?谢谢。
【问题讨论】:
标签: .net windows service process
我有两个 Windows 服务。一项服务将文件从 ftp 移动到包含子目录的目录中。另一个服务从这些目录中读取这些文件并执行一些需要很长时间的工作。当两个服务正在工作时,如何防止两个不同的服务访问同一个文件?谢谢。
【问题讨论】:
标签: .net windows service process
如果您需要同步这两个服务,您应该有某种方式在它们之间进行通信。
如果您不想被 IPC、消息队列 或 web-services 等过于“复杂”的基础架构所困扰,您可以使用简单的文件:
当第一个服务完成从 FTP 移动文件时,比如 "someDataFile.csv",它可以创建一个特殊的元数据文件,比如 ".process_someDataFile.csv",或者带有 GUID 的名称并且目标文件名保存在里面
要知道是否有事情要做,第二个服务将通过 polling(我认为更可靠)或通过使用 @ 注册文件夹中的更改来检查这些特殊文件987654323@
找到后处理目标文件,完成后删除元数据文件".process_someDataFile.csv"
这是安全的,因为如果处理崩溃第二个服务,重新启动服务时会注意到,通过查看元数据文件,它还有一些工作要做
在最坏的情况下,它会重新触发已经完成的工作,但这应该很容易在专用文件中保留对已经完成的工作的另一个跟踪
【讨论】:
您可以使用Mutex 来同步服务。
Mutex mutex = new Mutex(true, "{Some unique Identifier here}");
合适的标识符是Guid。您使用 Visual Studio 附带的guidgen.exe 创建一个。
然后你的文件访问是这样的:
mutex.WaitOne(timeout, true);
// File access
mutex.ReleaseMutex();
这甚至可以跨不同的进程工作,因为互斥锁是在系统范围内创建的。
如果您的服务之一没有释放互斥锁,超时将防止可能的死锁。
编辑:
请注意,使用互斥锁是不跨机器兼容的。
【讨论】:
Mutex 将不起作用。它完全取决于程序的要求。但我同意你的观点,你的解决方案更好,但实施起来也更复杂。