【问题标题】:Multiple instances of an application, how to close the first and keep the last?应用程序的多个实例,如何关闭第一个并保留最后一个?
【发布时间】:2014-04-16 12:37:24
【问题描述】:

我想在不中断任何服务的情况下更新应用程序,其想法是通知应用程序的第一个实例(又名旧版本)何时是最后一个(又名新版本) 已准备好开始。

示例:

  1. 旧版本正在运行
  2. 新版本开始
  3. 新版本检测到旧版本已经在运行
  4. 新版本准备投放
  5. 准备就绪后,新版本指示旧版本关闭
  6. 关闭时,旧版本通知新版本
  7. 新版本开始服务

时机成熟时,会使用更新的版本重复该过程。

这样服务会在尽可能短的时间内中断。


我的想法是使用系统范围的互斥锁,不幸的是它们在单声道中不可用,而且无论如何使用这种技术可能无法执行第 5 步。

另一种方法是使用管道,这在单声道上也不可用。

我的最后一个想法是在随机(恒定)端口上使用绑定到环回地址的套接字,您认为这很好还是有更好的方法来处理像我这样的情况?

所有代码都必须在 linux Mono.NET 上运行。

感谢阅读,法比奥·伊奥蒂。

【问题讨论】:

  • 这可能有点矫枉过正。您说的是哪种应用程序?服务?有用户界面的东西吗?
  • 它是一个 Web 服务器,所以是一个服务,一个控制台应用程序无论如何都可以。
  • 如果没有用户界面(关闭请求可能无限期等待),那么我只需要求进程终止(Process.Close())并开始等待(Process.WaitForExit)。旧版本将始终在退出之前处理待处理的请求,而新版本将一直待处理直到完成。无需 IPC。

标签: c# mono cross-platform multiple-instances


【解决方案1】:

有点骇人听闻,但你能写到一个已知的文件吗

  1. 应用程序启动并检查其他应用程序的文件
  2. 如果没有找到应用程序,则写入“我的 ID - 正在运行”,如果找到另一个正在运行的应用程序,则写入“我的 ID - 启动”
  3. 运行应用程序检查文件中是否有任何标记为启动的新应用程序”
  4. 如果发现启动应用停止服务并写入“my id - shutdown”,则终止应用
  5. 启动应用程序会轮询文件,直到发现没有应用程序在运行,然后它会启动服务并写入“my id - running”

这看起来像是一个类似问题的链接:

Simple cross-platform process to process communication in Mono?

【讨论】:

  • 有趣,无论如何,如果可能的话,我会避免轮询。感谢您的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-04
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
相关资源
最近更新 更多