2012-10-15 46 views
3

我有一個運行並啓動正常的Windows服務,但是,它運行後臺線程(多個)做一些嚴重的計算。如何禁用Windows Service C#的超時?

經過一番挖掘,我發現這是由於所有的Windows服務都有超時。目前,它從數據庫中的表中讀取數據,將數據加載到對象中,然後對所述對象進行一些分析。這一切都是在OnStart方法中完成的,該方法然後調用其他方法。有沒有一些技巧讓服務運行或以任何方式停止超時而不進入註冊表?謝謝

回答

5

的的OnStart功能不是邏輯需要很長的時間來執行的地方。基本上你需要在OnStart函數之外爲你的邏輯創建一個類。您需要公開聲明一個入口函數 - 即獲取數據並開始處理數據的函數。

例如

class ProcessingClass() 
{ 
    public void ThreadStartProc() 
    { 
     GetData(); 
     StartProcessing(); 
    } 
} 

在你的OnStart方法,創建一個新的線程和設定的ThreadStart您ThreadStartProc功能。例如

Thread ProcessingThread; 
ProcessingClass procClass = new ProcessingClass(); 

protected override void OnStart(string[] args) 
{ 
    ProcessingThread = new Thread(new ThreadStart(procClass.ThreadStartProc)); 
    ProcessingThread.Start(); 
} 

protected override void OnStop() 
{ 
    if (ProcessingThread != null) 
    { 
      ProcessingThread.Abort(); 
      ProcessingThread.Join(); 
      ProcessingThread = null; 
    } 
} 

在您的處理類中,您需要處理在服務停止時將引發的ThreadAbortException。

+0

不錯的例子西蒙! –

+0

我不完全理解OnStop方法的邏輯。如果你正在處理一個線程,然後關閉它,並通過將其設置爲null來使其不處理?不知道我明白了。謝謝! – Badmiral

+1

.Abort在上面的例子中拋出了ProcessingClass中的ThreadAbortException,允許你正常退出,整理資源等。但它不會等待線程退出。 Join,等待線程完成整理並退出。最後將ProcessingThread設置爲null只是我傾向於做的事情 - 幫助強制.NET垃圾收集器進行清理。 – Swomble

4
  1. 將您的邏輯移出OnStart方法。
  2. 使用Service.RequestAdditionalTime()方法。

看到這個蘇答案:windows service startup timeout

+0

據我所知,只有OnStart和OnStop,有沒有其他模式的Windows服務,以便將邏輯轉移到其中之一?謝謝 – Badmiral

+0

爲什麼數據庫對象加載時間過長?它可以重構嗎?如果不是,則將其關閉到一個單獨的線程中,然後在完成時啓動大型計算。 –

相關問題