在一个网站中,设定一些任务能够在后台定时执行。
1 public static void AddTask(int seconds, Action todo) 2 { 3 HttpRuntime.Cache.Insert( 4 Guid.NewGuid().ToString(), 5 0, 6 null, 7 DateTime.Now.AddSeconds(seconds), 8 Cache.NoSlidingExpiration, 9 CacheItemPriority.NotRemovable, 10 (key, value, reason) => 11 { 12 todo.Invoke(); 13 AddTask(seconds, todo); 14 }); 15 }
然后在 global.asax 里面的调用这个函数即可。
1 void x() 2 { 3 Debug.WriteLine(DateTime.Now); 4 } 5 6 void x2() 7 { 8 Debug.WriteLine("---" + DateTime.Now); 9 } 10 11 protected void Application_Start() 12 { 13 AddTask(40, x); 14 AddTask(60, x2); 15 //....... 16 }
需要说明的是,这个方案的原理是利用了ASP.NET的缓存机制,向ASP.NET的缓存集合中添加一个缓存项,设定过期的时间,当到达这个时间的时候,会执行一个回调函数,就把你要做的事情放到这个回调函数里,并且在执行要做的事儿之后,再次加入一个缓存项,如此不断地往复进行。
这里存在一个问题就是,在默认情况下,ASP.NET 每20秒回收一次缓存项,因此,这个方法不能把时间间隔设置的太小,我觉得至少分钟级别比较合适。
最后需要再次提醒的是,这个方法可以算是一个 hack 方法,并不是一个常规的优雅的做法。
Ps:
Easy Background Tasks in ASP.NET http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/