Using the ASP.NET Cache as a Scheduler
UPDATED
By using the ASP.NET cache, it is very easy to create a simple scheduling mechanism, for example, one that fires an event every X minutes. I once wrote a simple module to do just this, here is its code. It is up to you to enhance it to your needs!
public class SchedulerModule: IHttpModule { #region Public constructor public SchedulerModule() { this.Enabled = true; this.Interval = TimeSpan.FromMinutes(1); //fires every minute this.FirstTime = true; } #endregion #region Public properties public Boolean Enabled { get; set; } public TimeSpan Interval { get; set; } public Boolean FirstTime { get; private set; } #endregion #region Public events public event EventHandler Tick; public event EventHandler Start; public event EventHandler Stop; #endregion #region Protected methods protected void StartScheduler() { CacheItemRemovedCallback callback = null; HttpContext context = HttpContext.Current; callback = delegate(String key, Object value, CacheItemRemovedReason reason) { if (reason == CacheItemRemovedReason.Expired) { if (this.Enabled == true) { this.StartRunning(callback, context); } if (this.FirstTime == true) { this.FirstTime = false; this.OnStart(EventArgs.Empty); } this.OnTick(EventArgs.Empty); if (this.Enabled == false) { this.OnStop(EventArgs.Empty); } } }; this.StartRunning(callback, context); } protected void StartRunning(CacheItemRemovedCallback callback, HttpContext context) { context.Cache.Add(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), null, DateTime.Now + this.Interval, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, callback); } #endregion #region Protected virtual methods protected virtual void OnStart(EventArgs e) { EventHandler handler = this.Start; if (handler != null) { handler(this, EventArgs.Empty); } } protected virtual void OnStop(EventArgs e) { EventHandler handler = this.Stop; if (handler != null) { handler(this, EventArgs.Empty); } } protected virtual void OnTick(EventArgs e) { EventHandler handler = this.Tick; if (handler != null) { handler(this, EventArgs.Empty); } } #endregion #region IHttpModule Members public void Dispose() { this.Enabled = false; } public void Init(HttpApplication context) { this.StartScheduler(); } #endregion }
It exposes two properties:
- Enabled: if the scheduler is active
- Interval: the firing interval
As for the installation, you just have to reference it on your web.config:
There's two ways in which you can use it: by manually wiring an event, maybe on Application_Start, or by writing special methods, use one or the other, not both!
protected void Application_Start(Object sender, EventArgs e) { //Note: you do not have to do this if you use the following methods! //SchedulerModule schedulerModule = HttpContext.Current.ApplicationInstance.Modules.OfType<SchedulerModule>().Single(); SchedulerModule schedulerModule = this.Modules.OfType<SchedulerModule>().Single(); //Set the firing interval schedulerModule.Interval = TimeSpan.FromMinutes(5); schedulerModule.Start += this.Scheduler_Start; schedulerModule.Stop += this.Scheduler_Stop; schedulerModule.Tick += this.Scheduler_Tick; } protected void Scheduler_Start(Object sender, EventArgs e) { } protected void Scheduler_Stop(Object sender, EventArgs e) { } protected void Scheduler_Tick(Object sender, EventArgs e) { }