Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可靠地检测到我的另一个应用程序正在运行_C#_.net_Windows_Mutex - Fatal编程技术网

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

C# 可靠地检测到我的另一个应用程序正在运行,c#,.net,windows,mutex,C#,.net,Windows,Mutex,我有两个应用程序,一个WinForms应用程序和一个Windows服务,都将在同一台机器上运行。我希望WinForms应用程序能够可靠地检测服务何时运行。我完全可以控制这两个应用程序的设计和实现 我的第一个想法是使用由服务实例化并由WinForms应用程序检测的 有更好的设计吗?互斥是最好的选择。与使用进程名称等相比,它的脆弱性要小得多 但是,您需要确保互斥对象没有被垃圾收集。对于服务(它是事件驱动的,而不是运行到完成的“main”方法),最明智的方法可能是将其放入静态变量中 当服务停止时,处理

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

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


有更好的设计吗?

互斥是最好的选择。与使用进程名称等相比,它的脆弱性要小得多

但是,您需要确保互斥对象没有被垃圾收集。对于服务(它是事件驱动的,而不是运行到完成的“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());
   }
}