可靠地检测到我的另一个应用程序正在运行

时间:2009-06-10 12:22:51

标签: c# .net windows mutex

我有两个应用程序,一个WinForms应用程序和一个Windows服务,它们都运行在同一台机器上。我希望WinForms应用程序能够可靠地检测服务何时运行。我完全控制了两个应用程序的设计和实现。

我的第一个想法是使用Mutex,由服务实例化并可由WinForms应用程序检测。

有更好的设计吗?

6 个答案:

答案 0 :(得分:7)

ķ。 Scott Allen a good write up为此目的使用Mutex并且您将遇到GC的问题。

  

如果我想在机器上的所有会话中只运行一个应用程序实例,我可以将命名的互斥锁放入带有前缀“Global \”的全局命名空间。

[STAThread]
static void Main() 
{
   using(Mutex mutex = new Mutex(false, "Global\\" + appGuid))
   {
      if(!mutex.WaitOne(0, false))
      {
         MessageBox.Show("Instance already running");
         return;
      }

      Application.Run(new Form1());
   }
}

修改 将字符串文字更改为使用转义反斜杠而不是@,SO语法高亮显示不喜欢逐字字符串。

答案 1 :(得分:3)

Mutex是要走的路。它比使用进程名称等要脆弱得多。

但是,您需要确保Mutex不是垃圾回收。在服务(事件驱动而不是“主”方法运行完成)的情况下,最明智的方法是将它放在一个静态变量中。

当服务停止时处理互斥锁,因此您无需等待最终确定或类似的事情。

答案 2 :(得分:2)

您可以使用互斥锁,但也可以使用ServiceController类。这将允许您查明服务是否已安装,如果已安装但尚未启动,则启动它(如果适用)。

http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller_members.aspx

答案 3 :(得分:1)

您可以在服务上实现一些“连接测试”功能。我不知道这是否适合您的要求。 在winforms启动时,您可以调用该服务以查看它是否还活着。您可以使用简单的WCF合同公开服务。

希望这会有所帮助......

答案 4 :(得分:0)

similar question [根据那里的答案,你走在正确的轨道上]

答案 5 :(得分:0)

作为替代方案,您的WinForms应用程序可以检查正在运行的服务列表,以查看该服务是否正在运行。