我有一个 Windows 服务可以将文件上传到不同的 ftp 站点。
为了加快上传速度,此服务安装在 3 台机器上。然后问题就出现了,因为 3 个服务都在同一个位置寻找文件,有时他们只是拿起同一个文件然后抛出异常。
如何避免这种情况?.net 4.5
用with方法设计的服务async
,所以如果应用文件锁,性能会变慢吗?我是这样想的
- 获取目录中的所有文件名
- 然后锁定这个集合
- 以某种方式确保每个服务获得不同的子集合,例如,总共 30 个文件,然后每个服务获得 10 个。
但不知道如何。
我有一个 Windows 服务可以将文件上传到不同的 ftp 站点。
为了加快上传速度,此服务安装在 3 台机器上。然后问题就出现了,因为 3 个服务都在同一个位置寻找文件,有时他们只是拿起同一个文件然后抛出异常。
如何避免这种情况?.net 4.5
用with方法设计的服务async
,所以如果应用文件锁,性能会变慢吗?我是这样想的
但不知道如何。
您可以打开文件进行独占读取,如果失败则意味着另一个服务当前正在处理它,然后移动到下一个文件。
File.Open("test.txt", FileMode.Open, FileAccess.Read, FileShare.None);
您可以创建一个队列。它可以是 MSMQ 或其他服务,它将加载带有文件名的 db 表。您的其他服务可以使用一些锁表。
您将拥有一个包含单个记录的表,您的服务将update table t1 set t1.f1=t1.f1
在事务中调用该表。这将阻止其他服务继续进行。
在另一个表中,您有文件列表和一个标志(如果已被占用)。
考虑一项服务仅读取这些文件并加载文件名表。3 其他服务 - 端点,将锁定锁定表记录,然后继续读取n
文件名并将它们标记为已占用。加载文件后,可以删除文件名。如果服务在获取和删除之间失败:在下一个进程开始时,检查时间戳。如果文件被拿走了,比如说,昨天并且记录仍然存在,可能需要再次处理它们。