在ASP.NET中不管是使用后台进程还是使用Timer的方式都避免不了一个问题,就是ASP.NET会过一段时间后就回收了进程,而不管你后台有没有工作。只有当你再次请求该站点时它才会再次被执行。
我们可以测试一下,Global的APPLICATION_START事件中启动一个Timer第隔5秒钟向文件里写入一个时间,然后你启运这个首页,然后关掉,就会发现过一会儿它就不再向文件里写入内容了。(这个测试的代码上网有很多,这里就不提供代码了)。
为了解决这个问题,我们可以在Global中使用不断刷新Cache的来模拟一个请求,当Cache失效时系统自动请求一个指定的唤醒页面,这样子就模拟了一次请求,使你的应用程序永远处在运行的状态中。
public class Global : System.Web.HttpApplication { const string DummyCacheItemKey = "DummyCacheItem"; const string DummyPageUrl = "/RaiseUp.aspx"; protected void Application_Start(object sender, EventArgs e) { AlwaysRun(); } /// <summary> /// 使用Cache过期技术使应用程序永远在线 /// </summary> private void AlwaysRun() { if(null != HttpContext.Current.Cache[DummyCacheItemKey]) return; HttpContext.Current.Cache.Add(DummyCacheItemKey, String.Empty, null, DateTime.MaxValue, TimeSpan.FromMinutes(1), System.Web.Caching.CacheItemPriority.Normal, new System.Web.Caching.CacheItemRemovedCallback((x, y, z) => new System.Net.WebClient().DownloadData("HTTP://" + Request.Url.Authority + DummyPageUrl))); } protected void Application_BeginRequest(Object sender, EventArgs e) { if (HttpContext.Current.Request.Url.AbsolutePath == DummyPageUrl) AlwaysRun(); } }