C# 可靠地检测到我的另一个应用程序正在运行
我有两个应用程序,一个WinForms应用程序和一个Windows服务,都将在同一台机器上运行。我希望WinForms应用程序能够可靠地检测服务何时运行。我完全可以控制这两个应用程序的设计和实现 我的第一个想法是使用由服务实例化并由WinForms应用程序检测的C# 可靠地检测到我的另一个应用程序正在运行,c#,.net,windows,mutex,C#,.net,Windows,Mutex,我有两个应用程序,一个WinForms应用程序和一个Windows服务,都将在同一台机器上运行。我希望WinForms应用程序能够可靠地检测服务何时运行。我完全可以控制这两个应用程序的设计和实现 我的第一个想法是使用由服务实例化并由WinForms应用程序检测的 有更好的设计吗?互斥是最好的选择。与使用进程名称等相比,它的脆弱性要小得多 但是,您需要确保互斥对象没有被垃圾收集。对于服务(它是事件驱动的,而不是运行到完成的“main”方法),最明智的方法可能是将其放入静态变量中 当服务停止时,处理
有更好的设计吗?互斥是最好的选择。与使用进程名称等相比,它的脆弱性要小得多 但是,您需要确保互斥对象没有被垃圾收集。对于服务(它是事件驱动的,而不是运行到完成的“main”方法),最明智的方法可能是将其放入静态变量中 当服务停止时,处理互斥锁,这样您就不需要等待最终确定或类似的事情。K.Scott Allen已经开始为此目的使用互斥锁,并且您将在GC中遇到问题 如果我只想让应用程序的一个实例在机器上的所有会话中运行,我可以将命名的互斥体放入带有前缀“global\”的全局命名空间中 编辑:
将字符串文字更改为使用转义反斜杠而不是
@
,因此语法高亮显示程序不喜欢逐字字符串。作为替代方法,WinForms应用程序可以检查正在运行的服务列表,以查看服务是否正在运行。您可以在服务上实现一些“连接测试”功能。我不知道这是否能满足你的要求。
在winforms启动时,您可以调用该服务以查看它是否处于活动状态。您可以使用简单的WCF契约公开服务
希望这有帮助…您可以使用互斥锁,但也可以使用
ServiceController
类。这将允许您查明服务是否已安装,如果已启动但尚未启动,则在适用的情况下启动它
谢谢Roel,除非服务没有运行,否则这种方法比简单地检查互斥锁更加复杂。它可能的优点是,当服务启动、创建互斥锁并随后遭受一些损坏而导致其无响应时,您的WinForms应用程序将迅速得知坏消息。与ping相比,pinger并不真正关心pingee为何宕机。我不考虑这种方法,因为我们需要使用进程的易变名称,因此它的设计比其他方法更脆弱。GC.Collect()?哦,我相信他是在证明,即使GC在那个时候收集,互斥锁仍然不会被处理(因此被释放)——我会编辑以避免混淆。谢谢你指出这一点。
[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());
}
}