2012-11-08 35 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