2013-09-23 287 views
0

我想知道如何以我想要的方式重新啓動我的Windows服務。Windows服務重新啓動

我有這樣的解決方案:

private const int RestartTimeout = 60000; // 1 minute 

public void Control(string serviceName) 
{ 
    service = new ServiceController(serviceName); 
} 

public bool RestartService() 
     { 
      try 
      { 
       Control("MyService"); 
       service.Refresh(); 
       if (service.Status != ServiceControllerStatus.Stopped) 
       { 
        mytimer.Enabled = false; 
        service.Stop(); 
        int i = 0; 
        service.Refresh(); 

        while (service.Status == ServiceControllerStatus.Stopped || service.Status == ServiceControllerStatus.StopPending) 
        { 
         i++; 
         Thread.Sleep(100); 
         if (i >= RestartTimeout/100) 
         { 
          return false; 
         } 
        } 
        service.Start(); 
        return true; 
       } 

       service.Start(); 

       return true; 
      } 
      catch (Exception ex) 
      { 
       return false; 
      } 

     } 

我得到超時錯誤,當它到達while循環。我想這是因爲服務已經停止了?

我真正想在這裏實現的是停止服務,然後再次啓動服務之前再睡1分鐘。

Please help.Thanks!謝謝!

+0

出於興趣,重新啓動服務有什麼用? –

+0

我的服務通常只運行3-5分鐘,但如果超過這個時間,它將自動重新啓動,以防止它掛起或吃掉我的機器上的資源。謝謝 – SyntaxError

+0

當它沒有做任何事情時它不能睡覺嗎? –

回答

0

我解決了它這種方式(當然,你需要開始用管理員權限您的申請!):

小編建議:分割你的問題分成多個部分(多種方法),因爲如果出現錯誤,你可以縮小它下降到少量的線路。

public void RestartService(string serviceName) 
    { 
     if (StopService(serviceName) == true) 
     { 
      Thread.Sleep(60000); 
      if (StartService(serviceName) == true) 
      { 
       MessageBox.Show("Service started succesfully"); 
      } 
     } 
    } 

    private bool StartService(string serviceName) 
    { 
     ServiceController service = new ServiceController(serviceName); 
     try 
     { 
      service.Start(); 
      service.WaitForStatus(ServiceControllerStatus.Running); 
      return true; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
      return false; 
     } 
    } 

    private bool StopService(string serviceName) 
    { 
     ServiceController service = new ServiceController(serviceName); 
     try 
     { 
      if (service.Status != ServiceControllerStatus.Stopped) 
      { 
       service.Stop(); 
       service.WaitForStatus(ServiceControllerStatus.Stopped); 
       return true; 
      } 
      else if (service.Status == ServiceControllerStatus.Stopped) 
      { 
       return true; 
      } 
      return false; 
     } 
     catch(Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
      return false; 
     } 
    } 
+0

謝謝。這個工作,但只有當我設置線程睡眠20000-25000。更重要的是,它不會再進入服務的啓動。我有10秒初始化時間。這是超時問題嗎?35秒超時? – SyntaxError

+0

通常服務在30秒後超時(這是默認值)。您可以通過更改註冊表中的一個鍵來延長這段時間: 'HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control' - > 'ServicesPipeTimeout'。將值從'30000'改爲'100000' –

0

我有一個類似的asp.net項目,我用這個代碼,這是工作。

try 
{ 
ServiceController service = new ServiceController(service_name, computer_name); 
if (service.Status != ServiceControllerStatus.Running) 
{ 
return false; 
} 
else 
{ 
service.Stop(); 
Thread.Sleep(60000); 
service.Start(); 
} 
} 
catch (Exception exc) 
{ 
return false; 
} 

我知道你可以做到這一點,但有時它更好只是想想簡單。

+0

當它到達線程時,我仍然有一個超時錯誤。睡眠(60000)。::( – SyntaxError