C# windows服务之间的同步

C# windows服务之间的同步,c#,windows-services,synchronization,C#,Windows Services,Synchronization,我有一个windows服务,它只是读取一个共享的UNC文件夹,比如watch文件夹,然后选择前5个文件并进行一些处理,然后通过API将其传输到其他地方 此服务计划每5分钟运行一次。处理和传输可能需要5分钟以上 我将在5台服务器上运行此windows服务,我希望找到一种可靠的方法,使这些服务不会同时访问同一文件 我的想法是,无论哪个服务将访问,首先它将检查SQL server这些文件是否在处理列表中,就像处理文件表一样。如果没有,则将这些文件写入数据库并尝试提取它们,因此,如果有其他服务尝试访问同

我有一个windows服务,它只是读取一个共享的UNC文件夹,比如watch文件夹,然后选择前5个文件并进行一些处理,然后通过API将其传输到其他地方

此服务计划每5分钟运行一次。处理和传输可能需要5分钟以上

我将在5台服务器上运行此windows服务,我希望找到一种可靠的方法,使这些服务不会同时访问同一文件

我的想法是,无论哪个服务将访问,首先它将检查SQL server这些文件是否在处理列表中,就像处理文件表一样。如果没有,则将这些文件写入数据库并尝试提取它们,因此,如果有其他服务尝试访问同一文件夹,它将检查数据库并查看文件正在处理中。然后它将尝试下一个5文件


我想知道对于这种情况是否有一种已知的/更好的方法,那么我就不需要再发明轮子了。

使用SQL server进行类似的操作似乎有些过分了。您似乎有读/写文件夹的权限,因此一种方法是在处理文件时创建一个空的锁文件


因此,当服务器处理文件时,在目录中创建filename.ext.lock文件。如果另一台服务器看到此文件,它会知道忽略filename.ext文件,因为该文件已在处理中。如果您想了解更多信息,可以向.lock文件中添加信息,如服务器正在处理它、它何时启动等,以便进行调试。文件处理完成后,您可以删除.lock文件。

文件锁定将是最简单、最有效的方法

打开文件时,可以选择是否允许其他进程共享该文件。如果没有,则一次只能有一个进程打开该文件;其他进程将收到共享冲突

假设您使用的是.NET类,这意味着如果您选择的文件已在使用中,将引发异常。您可以捕获异常并尝试列表中的下一个文件

但是,要使用这种方法,您确实需要使用允许您指定共享模式的类打开文件。我相信大多数.NET类都直接或间接地提供了这种功能