微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

有更好的devise吗?

用于.NET 4.0的Permcalc.exe

在没有安装Excel的情况下以编程方式填充Excel模板

在.net中设置Windows服务描述的最佳方法是什么?

有没有办法检测到“几乎”远程桌面断开连接(即短暂的高延迟时间)?

如何基于单元格在DataGridView中单击来处理C#中的事件?

一个cpu上运行Java线程

如何从设备pipe理器获取信息?

用多个视图构buildC#.NET窗口应用程序

.netdebugging打印输出中的“无符号加载”是什么意思?

MSBuild“sgen.exe”丢失

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐