我有两个应用程序,一个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应用程序可以检查正在运行的服务列表以查看服务是否正在运行。