2012-05-29 125 views
1

所以我有一个用C#编写的Windows服务。服务类别从ServiceBase派生,并分别启动和停止服务调用实例方法OnStartOnStop。下面是类的SSCE:调用ServiceBase.OnStart和OnStop ...相同的实例?

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

我可以肯定这是这种情况吗?

+1

是的,你可以肯定。 – zmbq

+0

把它放在一个带有参考的答案中,我会向你提出要点! – spender

+0

嗯。你确定要做'IsBackground = true'吗?如果你从'OnStart'返回并且只有后台线程正在运行,那么这个进程可能会被关闭 - 所以它只能通过运气/计时(该线程已经向前发展了足够的进程来启动服务器) 。 –

回答

2

如果在Program.cs类看,你会看到如下代码:

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

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

1

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

private static CometService instance = null; 

protected override void OnStart(...) 
{ 
    instance = this; 
    ... 
} 

protected override void OnStop() 
{ 
    object.ReferenceEquals(this, instance); 
    ... 
}