2013-03-03 180 views
2

我想重新啓動名爲「後臺打印程序」的窗口服務我做了下面的代碼,但沒有運氣,任何機構有什麼關於發生了什麼錯誤? 代碼如何重新啓動窗口服務

using System.ServiceProcess; 

ServiceController service = new ServiceController("Spooler"); 

if ((service.Status.Equals(ServiceControllerStatus.Stopped)) || 
    (service.Status.Equals(ServiceControllerStatus.StopPending))) 
{ 
    service.Start(); 
} 
else 
{ 
    service.Stop(); 
    service.Start(); 
} 

例外是

「System.InvalidOperationException: '' 無法啓動服務 計算機後臺處理程序---> System.ComponentModel.Win32Exception:服務的一個實例 已經在System.ServiceProcess.Service運行

---內部異常堆棧跟蹤的結尾---

Controller.Start(字串[] args)

在System.ServiceProcess.ServiceController.Start()

在servicerestart.Form1.button1_Click(對象發件人,EventArgs的) 在d:\ samplecodes \ servicerestart \ servicerestart \ Form1.cs中:33" 行

+2

'但沒有運氣'不是一個非常準確的問題描述。你能否對不涉及運氣或上帝的問題進行更具體的描述,但涉及具體的錯誤信息或不良行爲。 – 2013-03-03 08:23:00

+1

@Darin Dimitrov我已更新我的問題 – vettori 2013-03-03 08:28:47

回答

9

您必須等待再次啓動它使用WaitForStatus方法之前停止服務後:

else 
{ 
    service.Stop(); 
    service.WaitForStatus(ServiceControllerStatus.Stopped); 
    service.Start(); 
    service.WaitForStatus(ServiceControllerStatus.Running); 
} 
+1

它看起來可以工作,但我沒有看到該服務停止並從服務小程序(SCM)開始。我們是否有任何機制能夠迅速制止並立即開始? – vettori 2013-03-03 08:38:45

+0

不,這是在.NET中啓動和停止服務的正確方法。服務啓動後您可能還會等待。 – 2013-03-03 08:40:04

+0

我不想在.Start();方法,將會有一個ServiceControllerStatus.Started方法。有編譯錯誤 – vettori 2013-03-03 08:44:46

0

我認爲問題是你需要管理員權限來啓動和停止服務,這就是爲什麼你必須提供所需的權利。

要做到這一點去改變ISS中的應用程序池的身份到LocalSystem。

希望這個幫助