2012-05-29 78 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); 
    ... 
}