2011-07-12 203 views
40

我遇到了一個我正在創建的應用程序的問題。我試圖通過我的C#應用​​程序啓動一個Windows服務。當我點擊我的開始按鈕時,它看起來像一切都經過,但是當我登錄到服務器時,該服務仍然不顯示它正在運行。但是,第二次運行它時,我收到一個異常,表示服務的實例已在運行。再次登錄到服務器時,服務似乎停止。有沒有人見過這個?以編程方式啓動Windows服務

這是我的代碼。

try 
{ 
    while (reader.Read()) 
    { 
     int timeoutMilliseconds = 1000; 
     string serviceName = reader["ServiceName"].ToString(); 
     string permission = reader["Permission"].ToString(); 

     if (permission == "E") 
     { 
      lblServStartSuccess.Visible = true; 

      ServiceController service = new ServiceController(serviceName); 
      TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); 

      service.Start(); 
      service.WaitForStatus(ServiceControllerStatus.Running, timeout); 
     } 
     else 
     { 
      lblServErrorStart.Visible = true; 
     } 
    } 
} 
catch (Exception ex) 
{ 
    Response.Write(ex.ToString()); 
} 

編輯:這是我的一個服務接收到異常:

System.InvalidOperationException:服務邏輯磁盤管理器管理服務沒有在計算機發現「」。 ---> System.ComponentModel.Win32Exception:指定的服務不存在作爲已安裝的服務---內部異常堆棧跟蹤結束---

我知道服務存在。我需要在服務前添加什麼東西來告訴它要查看哪個服務器?

+1

你確定服務沒有卡在起始狀態?我記得服務控制面板對於顯示(至少是某些windows版本以前)並不是很出色( – Rup

+0

)「當我登錄到服務器時」意味着什麼 - 您是否試圖在不同的機器上使用SCM? – BrokenGlass

+0

是的,我正在從遠程服務器運行Web服務。我正在使用具有管理員權限的帳戶。我不確定它是否卡住。我的超時時間是否會太短而超時? – Matt

回答

31

如果您顯示的代碼在不同於應該運行服務的機器上運行(如果情況確實如此,我不清楚您的註釋),那麼您需要提供機器名稱ServiceController構造器。是否有可能成功啓動該服務,但不是您認爲的機器上?這將符合你描述的症狀。

ServiceController service = new ServiceController(serviceName, serverName); 

http://msdn.microsoft.com/en-us/library/aa331793%28v=VS.71%29.aspx

+0

我已編輯以顯示使用遠程服務器名稱的構造函數。 – hatchet

+0

我認爲你是正確的,因爲現在我得到一個錯誤,說需要其他權限來執行此操作。 – Matt

+0

如果我作爲模擬用戶登錄到源服務器,我可以拉起目標服務器的服務管理器並遠程啓動和停止服務。我只是不能從網絡應用程序中完成。 – Matt

0

Just try service.Start();沒有超時或waitforstatus和掛鉤事件看看發生了什麼。

+0

看起來一切正常。它只是不顯示服務正在運行。 – Matt

14

這裏是代碼,我有責任停止啓動同一臺服務器上運行的其他服務窗口服務。

ServiceController controller = new ServiceController(serviceName); 
if (controller.Status==ServiceControllerStatus.Running) 
    controller.Stop(); 

if (controller.Status==ServiceControllerStatus.Stopped) 
    controller.Start(); 
2
public static void StartService(string serviceName, int timeoutMilliseconds) 
    { 
     ServiceController service = new ServiceController(serviceName); 
     try 
     { 
      int millisec1 = 0; 
      TimeSpan timeout; 

      // count the rest of the timeout 
      int millisec2 = Environment.TickCount; 
      timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec1)); 
      service.Start(); 
      service.WaitForStatus(ServiceControllerStatus.Running, timeout); 

     } 
     catch (Exception e) 
     { 
      Trace.WriteLine(e.Message); 
     } 
    } 
    public static void StopService(string serviceName, int timeoutMilliseconds) 
    { 
     ServiceController service = new ServiceController(serviceName); 
     try 
     { 
      int millisec1 = 0; 
      TimeSpan timeout; 
      if (service.Status == ServiceControllerStatus.Running) 
      { 
       millisec1 = Environment.TickCount; 
       timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); 
       service.Stop(); 
       service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); 
      } 


     } 
     catch (Exception e) 
     { 
      Trace.WriteLine(e.Message); 
     } 
    } 
    public static void RestartService(string serviceName, int timeoutMilliseconds) 
    { 
     ServiceController service = new ServiceController(serviceName); 
     try 
     { 
      int millisec1 = 0; 
      TimeSpan timeout; 
      if (service.Status == ServiceControllerStatus.Running) 
      { 
       millisec1 = Environment.TickCount; 
       timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); 
       service.Stop(); 
       service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); 
      } 
      // count the rest of the timeout 
      int millisec2 = Environment.TickCount; 
      timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2 - millisec1)); 
      service.Start(); 
      service.WaitForStatus(ServiceControllerStatus.Running, timeout); 

     } 
     catch (Exception e) 
     { 
      Trace.WriteLine(e.Message); 
     } 
    } 

不要忘記ServiceProcess添加作爲全球化志願服務青年 使用System.ServiceProcess;

+0

這是否會在問題中的代碼中添加任何內容? – Rup

3

這是一個古老的線程,但谷歌讓我在這裏。即使在成功啓動後,我的服務仍會回到停止狀態。 如果添加

service.Refresh(); 

它將查詢實際的當前狀態,而不是從以前的查詢所存儲的狀態。我不知道它爲什麼會這樣,但它確實如此。

P.S .:我增加了一分鐘時間,仍然得到一個服務停止響應沒有刷新。

相關問題