我正在構建一個Windows服務,它將根據數據庫中的計劃對用戶進行審計。該服務每十分鐘檢查一次數據庫的計劃審計。一旦開始審計,它會在數據庫表中標記一個開始時間,以便它在超過10分鐘時間內不會再次開始。Windows服務計時器多線程
我的問題是,下面的代碼是否可以接受我正在做的事情,並且我應該每次使用多線程10分鐘過去,如果是的話,我該如何實現?
我的示例代碼:
protected override void OnStart(string[] args)
{
var aTimer = new Timer(600000);
aTimer.Elapsed += ATimerElapsed;
aTimer.Interval = 600000;
aTimer.Enabled = true;
GC.KeepAlive(aTimer);
}
private static void ATimerElapsed(object sender, ElapsedEventArgs e)
{
try
{
Worker.ProcessScheduledAudits();
}
catch (Exception ex)
{
EventLog.WriteEntry("Application", ex.Message, EventLogEntryType.Error);
}
}
你是什麼意思的種族?順便提一下,我喜歡這個解決方案。 – Cyberdrew 2011-06-13 20:01:19
「比賽」我的意思是說,幾乎同時運行這個方法的兩個線程都可以檢查當前的運行情況,並在其中一個線程有機會將其設置爲true之前看到它是假的。然後這兩個線程將並行進入方法的肉,這是你不想要的。多用戶或多線程系統中的這些類型的錯誤通常稱爲「競爭條件」。但是,因爲您使用的定時器只會每10分鐘啓動一次該方法,所以除非使用定時器之外的其他機制調用此方法,否則不必擔心。 – KeithS 2011-06-13 21:07:15
感謝您的好評! – Cyberdrew 2011-06-14 13:00:47