2011-08-10 54 views
5

我正在使用.Net 4來構建一個簡單的Windows服務,當我想在啓動服務之前進行5分鐘的延遲時,問題就會發生。如何在開始Windows服務之前延遲5分鐘?

protected override void OnStart(string[] args) 
{ 
    // make a 5 min delay 
    // do something 
} 

但幾秒鐘後服務停止並給我一個超時錯誤(在事件日誌中看到了這一點)。 我想要做什麼?

+1

爲什麼要這樣? – TJHeuvel

回答

5

在新線程中啓動您的長時間運行進程,因此請勿阻止OnStart方法。例如:

using System.Threading; 

protected override void OnStart(string[] args) 
{ 
    ThreadPool.QueueUserWorkItem(new WaitCallback((_) => 
    { 
     Thread.Sleep(5 * 1000 * 60);//simulate 5 minutes work 

     // do something 
    })); 
} 
+1

是的。好主意。忽略來自操作系統的Windows延遲服務啓動選項,然後手動編碼。 – TomTom

+0

@TomTom:'是的。好主意。忽略來自操作系統的Windows延遲服務啓動選項,然後手動編碼。「爲什麼是-1呢?你錯了嗎? –

+2

TomTom是你酸所有版本的Windows支持延遲服務選項,因爲我使用的是Windows 2003. –

3

不要。服務必須在要求時開始。 OnStart必須返回。 FAST

也就是說,服務可以等待5分鐘,直到它DOES的東西,但你不能停止啓動週期。

啓動它,然後讓工作線程等待,直到它做一些事情。

也就是說,有一個配置條目允許延遲啓動服務。它配置爲FOR的服務,很像Manual, Automatic有一個delayed條目。這確保了服務僅在機器有一點時間從開始安置時開始。這可能會更好/足夠好。

+0

你能解釋更多關於配置條目嗎?請。 –

+0

打開一個windows服務配置,查看選項,使用google。不那麼難,來吧。讓我來做。谷歌「Windows服務啓動延遲」,第二項是... http://www.techrepublic.com/blog/datacenter/delayed-start-feature-increases-options-for-windows-services/1552 – TomTom

+0

@TomTom它會是很好的解決方案,但僅在Win7,Vista和2008服務器上受支持... – Incognito

1

服務必須在被告知啓動時作出響應,或Windows認爲其發生故障。所以你有兩個選擇:

  1. 寫一個獨立的應用程序,啓動時運行,等待5分鐘,然後啓動服務。

  2. 啓動服務,並在開始執行任何業務邏輯之前,將延遲放置5分鐘。只要Windows認爲它正常啓動,它就很開心。

事情是這樣的:

private static Timer t; 
protected override void OnStart(string[] args) 
{ 
    t = new Timer(5000*60); 
    t.Elapsed += new ElapsedEventHandler(OnTimedEvent) 
    t.Start() 
} 

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    // real code here 
} 
2

OnStart方法需要及時返回,否則你會得到一個超時錯誤。

你需要做的是從OnStart開始一個線程,並在該線程中等待5分鐘,然後再實際啓動服務。所以,你的OnStart方法變爲:

serviceThread = new Thread(new ThreadStart(workerClass.WorkerMethod)); 

serviceThread.Start(); 

而且WorkerClass.WorkerMethod做服務的實際出發。

1

我不明白你爲什麼要延遲5分鐘的服務啓動程序。如果服務例程需要更長時間,則Service Control Manager可能會中止所有操作,因此服務無法啓動。你需要在OnStart方法中啓動一個線程/定時器,然後在線程/定時器過程中等待5分鐘。

protected override void OnStart(string[] args) 
     {    
      Thread processor= new Thread(ThreadProc); 
      processor.Start(); 
     } 

     private void ThreadProc() 
     { 
      while (true) 
      { 
       Thread.Sleep(TimeSpan.FromMinutes(5)); 

      } 
     } 
1

使用System.Timers.Timer推遲您的操作...以下是我的一項服務中的一些代碼。我使用延遲的原因是因爲如果窗口從onstart事件返回需要很長時間,窗口假定服務已經中斷。由於我在服務第一次啓動時做了很多工作,我只需創建一個計時器即可快速啓動服務,然後讓該事件處理真正的啓動問題。

protected override void OnStart(string[] args) 
    { 
     try 
     { 
      // Using a timer Event to start asynchronously 
      StartupTimer = new Timer(); 
      StartupTimer.Elapsed += StartupTimer_Elapsed; 
      StartupTimer.AutoReset = false; 
      StartupTimer.Interval = 5*60*1000; 
      StartupTimer.Start(); 
     } 
     catch (Exception ex) 
     { 
      LogMessage(true, ex.ToString()); 
     } 
    } 

    private void StartupTimer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     try 
     { 
      RunSetup(true); 
     } 
     catch (Exception ex) 
     { 
      LogMessage(true, ex.ToString()); 
     } 
    } 
0

一種直接的方法是使用System.Threading.Timer並設置它適當的時候到5分鐘,請參閱System.Threading.Timer以獲取更多信息。

0

問題的根源在於,如果服務需要一段時間才能啓動,Windows會認爲它出現故障並將其殺死。

您可以通過首先告訴Windows該服務需要一些時間才能解決此問題。

要做到這一點,請參閱此SO問題的答案:windows service startup timeout

相關問題