我正在使用.Net 4來構建一個簡單的Windows服務,當我想在啓動服務之前進行5分鐘的延遲時,問題就會發生。如何在開始Windows服務之前延遲5分鐘?
protected override void OnStart(string[] args)
{
// make a 5 min delay
// do something
}
但幾秒鐘後服務停止並給我一個超時錯誤(在事件日誌中看到了這一點)。 我想要做什麼?
我正在使用.Net 4來構建一個簡單的Windows服務,當我想在啓動服務之前進行5分鐘的延遲時,問題就會發生。如何在開始Windows服務之前延遲5分鐘?
protected override void OnStart(string[] args)
{
// make a 5 min delay
// do something
}
但幾秒鐘後服務停止並給我一個超時錯誤(在事件日誌中看到了這一點)。 我想要做什麼?
在新線程中啓動您的長時間運行進程,因此請勿阻止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
}));
}
是的。好主意。忽略來自操作系統的Windows延遲服務啓動選項,然後手動編碼。 – TomTom
@TomTom:'是的。好主意。忽略來自操作系統的Windows延遲服務啓動選項,然後手動編碼。「爲什麼是-1呢?你錯了嗎? –
TomTom是你酸所有版本的Windows支持延遲服務選項,因爲我使用的是Windows 2003. –
不要。服務必須在要求時開始。 OnStart
必須返回。 FAST。
也就是說,服務可以等待5分鐘,直到它DOES的東西,但你不能停止啓動週期。
啓動它,然後讓工作線程等待,直到它做一些事情。
也就是說,有一個配置條目允許延遲啓動服務。它配置爲FOR的服務,很像Manual, Automatic
有一個delayed
條目。這確保了服務僅在機器有一點時間從開始安置時開始。這可能會更好/足夠好。
服務必須在被告知啓動時作出響應,或Windows認爲其發生故障。所以你有兩個選擇:
寫一個獨立的應用程序,啓動時運行,等待5分鐘,然後啓動服務。
啓動服務,並在開始執行任何業務邏輯之前,將延遲放置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
}
的OnStart
方法需要及時返回,否則你會得到一個超時錯誤。
你需要做的是從OnStart
開始一個線程,並在該線程中等待5分鐘,然後再實際啓動服務。所以,你的OnStart
方法變爲:
serviceThread = new Thread(new ThreadStart(workerClass.WorkerMethod));
serviceThread.Start();
而且WorkerClass.WorkerMethod
做服務的實際出發。
我不明白你爲什麼要延遲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));
}
}
使用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());
}
}
一種直接的方法是使用System.Threading.Timer並設置它適當的時候到5分鐘,請參閱System.Threading.Timer以獲取更多信息。
問題的根源在於,如果服務需要一段時間才能啓動,Windows會認爲它出現故障並將其殺死。
您可以通過首先告訴Windows該服務需要一些時間才能解決此問題。
要做到這一點,請參閱此SO問題的答案:windows service startup timeout
爲什麼要這樣? – TJHeuvel