我有一个Windows服务,可以在OnStart方法中启动一个线程。
基本上我希望能够在出现问题时(例如未处理的异常)停止服务。
目前我正在使用ServiceBase.Stop()
,但这涉及在线程可见的某个ServiceBase
实例,这反过来又涉及在主程序中将我的实例声明为public static
。
有没有“更好的方法”来停止服务?如果不是......这样做是否安全?
答案 0 :(得分:10)
最简单的,在我看来,最干净的方法是使用服务类的公共静态属性。唯一不行的是,如果您使用相同的服务类在同一个进程中运行多个服务,这是非常罕见的。
private static MyService m_ServiceInstance;
public static MyService ServiceInstance
{
get { return m_ServiceInstance; }
}
public MyService()
{
InitializeComponents();
//Other initialization
m_ServiceInstance = this;
}
将服务实例注入到可能需要它的每个方法中是一种替代方法,但它很快就会变得混乱,并且与使用静态属性相比没有任何明显的优势。
答案 1 :(得分:0)
查看example here如何使用ServiceController类来启动和停止服务。
或者,您可以在创建时将服务实例传递给线程(或将其设置为线程类中的实例变量等),而不必使服务类保持静态。
完整性的简短示例:
ServiceController sc = new ServiceController("MyService");
sc.Stop();