Calling ServiceBase.OnStart 和 OnStop..相同的实例

本文关键字:实例 OnStop ServiceBase OnStart Calling | 更新日期: 2023-09-27 18:35:33

所以我有一个用c#编写的Windows服务。服务类派生自 ServiceBase ,启动和停止服务调用实例方法分别OnStartOnStop。这是该类的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实例。

我能确定是这种情况吗?

Calling ServiceBase.OnStart 和 OnStop..相同的实例

如果您查看Program.cs类,您将看到如下所示的代码:

private static void Main()
{
    ServiceBase.Run(new ServiceBase[]
                {
                    new CometService()
                });
}

也就是说,实例是由您自己的项目中的代码创建的。这是所有服务管理器调用(包括OnStartOnStop)都针对的一个实例。

我想是同一个实例。您可以执行快速测试,在类中添加静态字段,以跟踪对 OnStart 中使用的对象的引用,并将其与 OnStop 实例进行比较。

private static CometService instance = null;
protected override void OnStart(...)
{
    instance = this;
    ...
}
protected override void OnStop()
{
    object.ReferenceEquals(this, instance);
    ...
}