我有两个应用程序,一个WinForms应用程序和一个Windows服务,它们都运行在同一台机器上。我希望WinForms应用程序能够可靠地检测服务何时运行。我完全控制了两个应用程序的设计和实现。
我的第一个想法是使用Mutex,由服务实例化并可由WinForms应用程序检测。
有更好的设计吗?
答案 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应用程序可以检查正在运行的服务列表,以查看该服务是否正在运行。