我在創建一個C#.Net Windows服務,想知道您是否總是需要在服務的OnStop()
方法中調用base.OnStop();
,爲什麼?爲什麼在Windows服務停止時調用base.OnStop()?
protected override void OnStop()
{
threadRunning = false;
this.ExitCode = 0;
base.OnStop();
}
我在創建一個C#.Net Windows服務,想知道您是否總是需要在服務的OnStop()
方法中調用base.OnStop();
,爲什麼?爲什麼在Windows服務停止時調用base.OnStop()?
protected override void OnStop()
{
threadRunning = false;
this.ExitCode = 0;
base.OnStop();
}
從文檔上ServiceBase.OnStop:
調用OnStop預計 派生類被重寫。對於服務 是有用的,OnStart和OnStop應 都在您的服務 類實施。
所以它真的被用作通知您的服務,它停止。
在爲ServiceBase.cs的.NET源代碼一瞥揭示方法不起作用:
protected virtual void OnStop()
{
}
所以,你需要調用它?不,但這樣做仍然是一種很好的形式。基地實施可能有一天會改變。
「好的叫它」的事情是一個愚蠢的想法。如果基礎實現有變化 - 你什麼時候調用它?你自己的代碼之前還是之後?太多的未知數知道是否打電話,你完全由文檔來填補空白 - 所以除非文檔告訴你打電話,我不會打擾。國際海事組織(IMO) - 調用基本方法的能力是一個愚蠢的想法,如果沒有它,語言會更好。 :p – 2010-09-01 18:14:14
這是隱含的繼承成本,只有好的文檔才能解決這個問題。 ServiceBase類在必須被設計爲抽象類的邊緣搖搖欲墜。 OnStart和OnStop是抽象的,所以不會有任何猜測。 – 2010-09-01 18:33:05
你不需要。這隻意味着,如果您在ServiceBase
和您的實際服務之間插入了額外的基類,那麼您將調用OnStop
方法(如果它被覆蓋)。我不相信ServiceBase.OnStop
本身會執行任何操作。
通常在重寫IMO時調用基本方法是個好主意,除非您特別要防止「正常」行爲發生......但在這種情況下,省略呼叫將不會有任何不良影響。
你不需要。
OnStop是一個在ServiceBase中定義的虛擬方法,允許您覆蓋可以處理停止服務的地方。在(稍微)一般情況下,當你重寫一個虛擬方法時,你也可以調用基本虛擬方法。唯一一次你不叫它是當你想停止正常的事情發生。
在Servicebase的情況下,OnStop什麼都不做,所以你不需要調用它。
您實際上不必撥打該電話。如果您使用Reflector查看ServiceBase類中的OnStop方法,您將看到它完全沒有任何作用。
與你的問題無關,但值得注意的是:不要使用'thread.Abort();'。 – dtb 2010-09-01 16:32:29
@dtp,正式記錄 – 2010-09-01 16:43:59