2012-11-08 33 views
2

我有不斷被許多線程讀取的數據。這些數據需要每天更新。System.Timer作爲一個單身人士

我的方法是使用ReaderWriterLockSlim來管理對數據的訪問。每天晚上,檢測日期變化的第一個線程對數據應用WriteLock並更新它。

爲了避免對日更改事件進行持續檢查。理想情況下,我希望創建一個System.Timer對象作爲單例,並讓它自動啓動,然後每24小時執行一次。

這一直是我的方法:

首先我伸出System.Timers到初始化執行回調。

using System.Timers; 

namespace Utilities 
{ 
    class AutoStartTimer : Timer 
    { 
     public AutoStartTimer(ElapsedEventHandler callback, int period):base(period) 
     { 
      callback(null, null); 
      AutoReset = true; 
      Elapsed += callback; 
      Enabled = true; 
     } 
    } 
} 

然後我在一個需要它的單例中聲明它。

private static AutoStartTimer _loadDataTimer = 
           new AutoStartTimer(DataLoader, 86400000); // Daily 

這種方法到目前爲止還在爲我工作。不過,我想知道是否有更好的方法來實現Singleton Timer,它在初始化時執行一次,然後在一段時間後執行,或者如果有人設法在不擴展Timer類的情況下更有效地執行此操作。

我需要在我當前的項目中使用其中的很多項目,所以我想確保使用的是一種很好的方法。

謝謝。

+0

爲什麼不是一個靜態的定時器實例添加到管理該實例的另一個類? – Davio

+0

不需要檢查initilise /每當我創建該類的實例時,定時器是否爲空? – Totero

+0

使用靜態類。 :) – Davio

回答

2

使用靜態類:

public static class DayManager 
{ 
    public static readonly object SyncRoot = new object(); 

    private static readonly Timer dayTimer; 

    static DayManager() 
    { 
     dayTimer = new Timer { AutoReset = true; Enabled = true; Interval = 86400000d }; 
     dayTimer.Elapsed += OnDayTimerElapsed; 
    } 

    protected void OnDayTimerElapsed(object sender, ElapsedEventArgs e) 
    { 
     if(DayPassedEvent != null) 
     { 
      DayPassedEvent(this, null); 
     } 
    } 

    public event EventHandler DayPassedEvent; 
} 

現在,在每一個你應該訂閱DayPassedEvent和使用Monitor.TryEnter(DayManager.SyncRoot)來獲取對定時器管理類鎖的線程。這意味着只有一個線程應該繼續嘗試更新數據,其他線程應該無法獲得鎖定並繼續其生命。我將把這個確切的實施留給你。

或者,您可以從此處的定時器管理類中刪除SyncRoot,並使用另一個,因爲您已經在做,我只是提供它僅供參考。

+0

我不需要在24小時的時間間隔內運行......但我確實喜歡將解決方案作爲在特定時間發生更新的方式。謝謝! – Totero

+0

好吧,措辭很尷尬,因爲它不會在零點運行,但它每24小時運行一次。當我提供示例解決方案時,我不會很注意適當的命名。 :D – Davio

+0

剛注意到我自己。解決方案正是我所期待的。 – Totero

1

我有更好的方法給你。使用Codeplex的Lightweight Scheduler庫。

輕量級任務調度庫,允許您在指定的時間或間隔內輕鬆調度回調方法的調用。支持.NET 3.5和Silverlight。

庫允許包括flexibule調度功能與代碼,只需幾行您的應用程序,並提供了流暢的API來配置工作:

鏈接: http://scheduling.codeplex.com/

其他方法:

Task Scheduler Class in。NET: http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskscheduler.aspx

http://taskscheduler.codeplex.com/

http://www.codeproject.com/Articles/1763/Task-Scheduler-Library-for-NET

+0

謝謝!我會研究你發送的鏈接。 – Totero