2011-06-13 98 views
1

我正在構建一個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); 
    }     
} 

回答

2

System.Threading.Timer將使用線程池中的線程來運行Elapsed處理程序。所以,你已經通過使用定時器來使用多線程了。實際上,所有計時器都使用某種後臺線程;他們只是在多線程的方式上有所不同,以便做出最有意義的用途。

如果您需要每十分鐘運行一次,但也要確保兩個處理程序永遠不會同時運行,請嘗試在Elapsed方法中設置「CurrentlyRunning」標誌,並在執行任何繁重工作之前檢查它。

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 currentlyRunning; 

    private static void ATimerElapsed(object sender, ElapsedEventArgs e) 
    { 
     if(currentlyRunning) return; 
     currentlyRunning = true; 
     try 
     { 
      Worker.ProcessScheduledAudits(); 
     } 
     catch (Exception ex) 
     { 
      EventLog.WriteEntry("Application", ex.Message, EventLogEntryType.Error); 
     } 
     currentlyRunning = false; 
    } 

從理論上講,這可以比賽,但你只踢了一個線程此事件每10分鐘的機率是非常不可能的。

+0

你是什麼意思的種族?順便提一下,我喜歡這個解決方案。 – Cyberdrew 2011-06-13 20:01:19

+1

「比賽」我的意思是說,幾乎同時運行這個方法的兩個線程都可以檢查當前的運行情況,並在其中一個線程有機會將其設置爲true之前看到它是假的。然後這兩個線程將並行進入方法的肉,這是你不想要的。多用戶或多線程系統中的這些類型的錯誤通常稱爲「競爭條件」。但是,因爲您使用的定時器只會每10分鐘啓動一次該方法,所以除非使用定時器之外的其他機制調用此方法,否則不必擔心。 – KeithS 2011-06-13 21:07:15

+0

感謝您的好評! – Cyberdrew 2011-06-14 13:00:47

1

此代碼已經 「使用多線程」。假設Timer實例爲System.Timers.Timer,則Elapsed處理程序將在線程池線程上運行。

如果這不是您想要的,您可以使用SynchronizingObject屬性來修改調度行爲。欲瞭解更多詳情,請閱讀the MSDN documentation

+0

感謝您澄清定時器實例。 – Cyberdrew 2011-06-13 20:01:40