2010-09-01 62 views
14

我在創建一個C#.Net Windows服務,想知道您是否總是需要在服務的OnStop()方法中調用base.OnStop();,爲什麼?爲什麼在Windows服務停止時調用base.OnStop()?

protected override void OnStop() 
{ 
    threadRunning = false; 

    this.ExitCode = 0; 
    base.OnStop(); 
} 
+1

與你的問題無關,但值得注意的是:不要使用'thread.Abort();'。 – dtb 2010-09-01 16:32:29

+0

@dtp,正式記錄 – 2010-09-01 16:43:59

回答

12

從文檔上ServiceBase.OnStop

調用OnStop預計 派生類被重寫。對於服務 是有用的,OnStart和OnStop應 都在您的服務 類實施。

所以它真的被用作通知您的服務,它停止。

在爲ServiceBase.cs的.NET源代碼一瞥揭示方法不起作用:

protected virtual void OnStop() 
{ 
} 

所以,你需要調用它?不,但這樣做仍然是一種很好的形式。基地實施可能有一天會改變。

+4

「好的叫它」的事情是一個愚蠢的想法。如果基礎實現有變化 - 你什麼時候調用它?你自己的代碼之前還是之後?太多的未知數知道是否打電話,你完全由文檔來填補空白 - 所以除非文檔告訴你打電話,我不會打擾。國際海事組織(IMO) - 調用基本方法的能力是一個愚蠢的想法,如果沒有它,語言會更好。 :p – 2010-09-01 18:14:14

+6

這是隱含的繼承成本,只有好的文檔才能解決這個問題。 ServiceBase類在必須被設計爲抽象類的邊緣搖搖欲墜。 OnStart和OnStop是抽象的,所以不會有任何猜測。 – 2010-09-01 18:33:05

6

你不需要。這隻意味着,如果您在ServiceBase和您的實際服務之間插入了額外的基類,那麼您將調用OnStop方法(如果它被覆蓋)。我不相信ServiceBase.OnStop本身會執行任何操作。

通常在重寫IMO時調用基本方法是個好主意,除非您特別要防止「正常」行爲發生......但在這種情況下,省略呼叫將不會有任何不良影響。

6

你不需要。

OnStop是一個在ServiceBase中定義的虛擬方法,允許您覆蓋可以處理停止服務的地方。在(稍微)一般情況下,當你重寫一個虛擬方法時,你也可以調用基本虛擬方法。唯一一次你不叫它是當你想停止正常的事情發生。

在Servicebase的情況下,OnStop什麼都不做,所以你不需要調用它。

2

您實際上不必撥打該電話。如果您使用Reflector查看ServiceBase類中的OnStop方法,您將看到它完全沒有任何作用。