2010-09-24 52 views
0

我得到一個服務控制器爲我服務的一個:ServiceControllerStatus沒有給我目前的狀態

foreach (ServiceController sc in ServiceController.GetServices()) 
{ 
    if (sc.ServiceName == ConfigurationManager.SYNC_SERVICE_NAME) 
    { 
     this._serviceController = sc; 
     break; 
    } 
} 

,然後調用就可以了狀態功能,當用戶觸發動作:

private void tsmiStartServer_Click(object sender, EventArgs e) 
{ 
    if (_serviceController.Status == ServiceControllerStatus.Stopped)      
     this._serviceController.Start(); 
} 

但是,即使服務停止,狀態也會顯示爲正在運行。事實上,狀態似乎並沒有改變,導致我認爲它在我得到服務控制器對象的時候被檢測和緩存。

但是,我發現如果我在調用Status屬性之前先執行Refresh()調用,它將檢測到服務的正確狀態。這似乎與doco關於調用「獲取此實例引用的服務的狀態」的內容相矛盾。除非我不再以某種方式引用正確的實例... ??

回答

2

請立即撥打了ServiceControllerRefresh方法,以確保您有當前狀態:

private void tsmiStartServer_Click(object sender, EventArgs e) 
{ 
    _serviceController.Refresh(); 
    if (_serviceController.Status == ServiceControllerStatus.Stopped)      
     this._serviceController.Start(); 
} 
+0

正如我在這個問題的最後一段說,這樣做「工作」,但似乎打敗目的有一個狀態屬性是爲了給我的服務的狀態,而不是狀態的緩存版本?如果這是有道理的......我也檢查了多個地方的狀態,似乎很多代碼重複。 – Joe 2010-09-24 07:29:55

+0

@Joe:對不起,我錯過了那部分。但我完全同意你的看法。該文件令人困惑。關於在多個地方檢查狀態:這聽起來像是有一些重構的空間。您可以輕鬆地提供一個靜態方法來封裝此行爲,這將減少代碼重複。 – 2010-09-24 07:34:49

+0

我對讓身份不清爽的設計決定感到非常震驚。如果我想要一個緩存,我會將它緩存在我自己的代碼中(天知道爲什麼我想首先緩存過時的狀態)。 接受失敗的答案。 – Joe 2010-09-24 08:16:34

相關問題