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

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

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

有更好的devise吗?

互斥体是要走的路。 这比使用进程名称更脆弱

但是,您需要确保互斥锁未被垃圾收集。 在服务的情况下(这是事件驱动的,而不是有一个“主要”方法运行到完成),最明智的做法可能是把它放在一个静态变量中。

当服务停止时,处理互斥锁,所以你不需要等待定案或类似的东西。

K. Scott Allen在写这篇文章的时候已经写了一篇关于使用互斥体的文章,以及你会遇到的问题。

如果我只想在机器上的所有会话中只运行一个应用程序实例,则可以将名为互斥体的前缀“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语法突出显示不喜欢逐字字符串。

您可以使用互斥锁,但也可以使用ServiceController类。 这将允许您找出服务是否已安装,如果是但尚未启动,则在适用的情况下启动它。

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

你可以在服务上实现一些“连接测试”功能。 我不知道这是否会满足您的要求。 在winforms启动时,你可以打电话给服务,看看它是否还活着。 您可以使用简单的WCF合约来公开服务。

希望这可以帮助…

类似的问题 [根据那里的答案,你在正确的轨道上]

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