【问题标题】:Windows. Service multiple instances processing files from same single directory duplication视窗。服务多个实例处理来自同一个目录重复的文件
【发布时间】:2015-10-21 02:07:57
【问题描述】:

我有 .net windows 服务,它从文件夹中获取图像文件列表并进行一些转换并将转换后的文件发送到另一个目录。我希望通过添加另一个服务实例来监视同一个文件夹来实现更高的吞吐量。我想要 2 个实例独立处理文件而没有任何重复处理。 可以使用哪些模式? 文件锁定适用于此吗? 不想使用数据库或任何其他消息传递平台。 如果需要,我可以使用文本文件等来创建同步。

【问题讨论】:

  • 我们正试图通过复制来实现高可用性......一个服务出现故障,另一个可以继续处理
  • 可能会发生吗?比整个操作系统崩溃更重要吗?您是否考虑过将服务配置为自动重新启动,或者让看门狗服务根据需要重新启动它? ...但是是的,文件锁定可能就是您所需要的。

标签: c# windows file service locking


【解决方案1】:
  1. 如果使用 .net,我会考虑创建多个线程(在 .net 中使用 TPL),用于并行处理文件。这样,您就拥有一个可以控制整个流程的流程。因此无需跟踪哪个进程(exe)正在处理文件、没有数据库、没有锁定等。

  2. 但是,如果您希望多个进程处理文件,那么同步处理的一种选择是使用 Mutex。

我会将此选项与解决方案 1 一起使用。 IE。在一项服务中使用 TPL(多线程)。并且还使用互斥锁。这样,您就可以享受多线程和多服务的好处。希望这就是你所追求的。

https://msdn.microsoft.com/en-us/library/bwe34f1k(v=vs.110).aspx

在处理任何文件之前,创建一个具有特定名称的 Mutex,如果已授予所有权,则继续处理该文件。如果尚未授予所有权,您可以放心地假设另一个进程或另一个线程(在同一应用程序内)已获得此 Mutex 的锁定,这意味着另一个进程/线程已经在处理该文件。

示例代码:

var fileMutex = new Mutex(true, "File Name", out mutexWasCreated);
if (mutexWasCreated){
    //Some other process/thread is processing this file, so nothing to do
}
else {
    //Start processing the file
}

如果一个服务 (exe) 出现故障,则线程将终止,这意味着互斥锁将被释放,这些文件将可供另一个进程处理。

【讨论】:

  • 我们也在尝试通过复制来实现高可用性......一个服务出现故障,另一个可以继续处理......
猜你喜欢
  • 2019-12-15
  • 2020-10-15
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多