Calling ServiceBase.OnStart 和 OnStop..相同的实例
本文关键字:实例 OnStop ServiceBase OnStart Calling | 更新日期: 2023-09-27 18:35:33
所以我有一个用c#编写的Windows服务。服务类派生自 ServiceBase
,启动和停止服务调用实例方法分别OnStart
和OnStop
。这是该类的SSCE:
partial class CometService : ServiceBase
{
private Server<Bla> server;
private ManualResetEvent mre;
public CometService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
//starting the server takes a while, but we need to complete quickly
//here so let's spin off a thread so we can return pronto.
new Thread(() =>
{
try
{
server = new Server<Bla>();
}
finally
{
mre.Set()
}
})
{
IsBackground = false
}.Start();
}
protected override void OnStop()
{
//ensure start logic is completed before continuing
mre.WaitOne();
server.Stop();
}
}
可以看出,有很多逻辑要求当我们调用OnStop
时,我们正在处理与调用OnStart
时相同的ServiceBase
实例。
我能确定是这种情况吗?
如果您查看Program.cs
类,您将看到如下所示的代码:
private static void Main()
{
ServiceBase.Run(new ServiceBase[]
{
new CometService()
});
}
也就是说,实例是由您自己的项目中的代码创建的。这是所有服务管理器调用(包括OnStart
和OnStop
)都针对的一个实例。
我想是同一个实例。您可以执行快速测试,在类中添加静态字段,以跟踪对 OnStart 中使用的对象的引用,并将其与 OnStop 实例进行比较。
private static CometService instance = null;
protected override void OnStart(...)
{
instance = this;
...
}
protected override void OnStop()
{
object.ReferenceEquals(this, instance);
...
}