我有一個運行並啓動正常的Windows服務,但是,它運行後臺線程(多個)做一些嚴重的計算。如何禁用Windows Service C#的超時?
經過一番挖掘,我發現這是由於所有的Windows服務都有超時。目前,它從數據庫中的表中讀取數據,將數據加載到對象中,然後對所述對象進行一些分析。這一切都是在OnStart方法中完成的,該方法然後調用其他方法。有沒有一些技巧讓服務運行或以任何方式停止超時而不進入註冊表?謝謝
我有一個運行並啓動正常的Windows服務,但是,它運行後臺線程(多個)做一些嚴重的計算。如何禁用Windows Service C#的超時?
經過一番挖掘,我發現這是由於所有的Windows服務都有超時。目前,它從數據庫中的表中讀取數據,將數據加載到對象中,然後對所述對象進行一些分析。這一切都是在OnStart方法中完成的,該方法然後調用其他方法。有沒有一些技巧讓服務運行或以任何方式停止超時而不進入註冊表?謝謝
的的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。
看到這個蘇答案:windows service startup timeout
據我所知,只有OnStart和OnStop,有沒有其他模式的Windows服務,以便將邏輯轉移到其中之一?謝謝 – Badmiral
爲什麼數據庫對象加載時間過長?它可以重構嗎?如果不是,則將其關閉到一個單獨的線程中,然後在完成時啓動大型計算。 –
不錯的例子西蒙! –
我不完全理解OnStop方法的邏輯。如果你正在處理一個線程,然後關閉它,並通過將其設置爲null來使其不處理?不知道我明白了。謝謝! – Badmiral
.Abort在上面的例子中拋出了ProcessingClass中的ThreadAbortException,允許你正常退出,整理資源等。但它不會等待線程退出。 Join,等待線程完成整理並退出。最後將ProcessingThread設置爲null只是我傾向於做的事情 - 幫助強制.NET垃圾收集器進行清理。 – Swomble