【问题标题】:Calling ServiceBase.OnStart and OnStop... same instance?调用 ServiceBase.OnStart 和 OnStop... 同一个实例?
【发布时间】:2012-05-29 22:14:09
【问题描述】:

所以我有一个用 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 时,我们处理的ServiceBase 实例与调用OnStart 时相同。

我可以确定是这样吗?

【问题讨论】:

  • 把它放在一个带有参考的答案中,我会给你积分!
  • 嗯。你确定要IsBackground = true吗?如果您从OnStart 返回并且只有后台线程正在运行,则该进程可能会被关闭 - 所以只有运气/时机(该线程已经取得足够的前进进度来启动Server)服务才能保持正常运行.
  • 确实...实际上在实际代码中并不是这样,所以请忽略。不过会修正这个例子。
  • IsBackground = true 很好。该服务将保存在内存中,直到调用 OnStop - 这就是服务的含义。如果您的 OnStart 和 OnStop 方法为空,则该进程在启动时仍将保留在内存中。

标签: c# windows-services


【解决方案1】:

如果您查看 Program.cs 类,您会看到如下代码:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-19
      • 2016-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多