我有两个应用程序,一个WinForms应用程序和一个Windows服务,将在同一台机器上运行。 我希望WinForms应用程序能够可靠地检测服务何时运行。 我完全控制这两个应用程序的devise和实现。
我的第一个想法是使用一个互斥体 ,由服务实例化和WinForms应用程序可检测。
有更好的devise吗?
用于.NET 4.0的Permcalc.exe
在没有安装Excel的情况下以编程方式填充Excel模板
在.net中设置Windows服务描述的最佳方法是什么?
有没有办法检测到“几乎”远程桌面断开连接(即短暂的高延迟时间)?
如何基于单元格在DataGridView中单击来处理C#中的事件?
如何从设备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] 举报,一经查实,本站将立刻删除。