1

我有一个 Windows 服务可以将文件上传到不同的 ftp 站点。

为了加快上传速度,此服务安装在 3 台机器上。然后问题就出现了,因为 3 个服务都在同一个位置寻找文件,有时他们只是拿起同一个文件然后抛出异常。

如何避免这种情况?.net 4.5用with方法设计的服务async,所以如果应用文件锁,性能会变慢吗?我是这样想的

  1. 获取目录中的所有文件名
  2. 然后锁定这个集合
  3. 以某种方式确保每个服务获得不同的子集合,例如,总共 30 个文件,然后每个服务获得 10 个。

但不知道如何。

4

2 回答 2

2

您可以打开文件进行独占读取,如果失败则意味着另一个服务当前正在处理它,然后移动到下一个文件。

File.Open("test.txt", FileMode.Open, FileAccess.Read, FileShare.None);
于 2013-09-17T21:07:26.240 回答
0

您可以创建一个队列。它可以是 MSMQ 或其他服务,它将加载带有文件名的 db 表。您的其他服务可以使用一些锁表。

您将拥有一个包含单个记录的表,您的服务将update table t1 set t1.f1=t1.f1在事务中调用该表。这将阻止其他服务继续进行。

在另一个表中,您有文件列表和一个标志(如果已被占用)。

考虑一项服务仅读取这些文件并加载文件名表。3 其他服务 - 端点,将锁定锁定表记录,然后继续读取n文件名并将它们标记为已占用。加载文件后,可以删除文件名。如果服务在获取和删除之间失败:在下一个进程开始时,检查时间戳。如果文件被拿走了,比如说,昨天并且记录仍然存在,可能需要再次处理它们。

于 2013-09-17T21:40:41.130 回答