虽然在Web应用程序中这样做并不理想,但它是可行的,只要网站一直在线。
以下是一个示例:我正在全局.asax中创建一个带有过期时间的缓存项。当它过期时,将触发一个事件。您可以在OnRemove()事件中获取您的数据或其他内容。
然后,您可以设置一个调用页面(最好是非常小的页面),该页面将在Application_BeginRequest中触发代码,以添加具有过期时间的缓存项。
global.asax:
private const string VendorNotificationCacheKey = "VendorNotification";
private const int IntervalInMinutes = 60;
protected void Application_Start(object sender, EventArgs e)
{
CacheItemRemovedCallback callback = OnRemove;
Context.Cache.Add(VendorNotificationCacheKey, DateTime.Now, null, DateTime.Now.AddMinutes(IntervalInMinutes), TimeSpan.Zero,
CacheItemPriority.Normal, callback);
}
private void OnRemove(string key, object value, CacheItemRemovedReason reason)
{
SendVendorNotification();
var siteUrl = ConfigurationManager.AppSettings.Get("SiteUrl");
var client = new WebClient();
client.DownloadData(siteUrl + "default.aspx");
client.Dispose();
}
private void SendVendorNotification()
{
}
protected void Application_BeginRequest(object sender, EventArgs e)
{
if (HttpContext.Current.Request.Url.ToString().ToLower().Contains("default.aspx") &&
HttpContext.Current.Cache[VendorNotificationCacheKey] == null)
{
CacheItemRemovedCallback callback = OnRemove;
Context.Cache.Add(VendorNotificationCacheKey, DateTime.Now, null, DateTime.Now.AddMinutes(IntervalInMinutes), TimeSpan.Zero,
CacheItemPriority.Normal, callback);
}
}
如果你的定时任务很快,这个方法会很有效。但如果它是一个长时间运行的过程...那么你一定要把它从你的Web应用程序中拿出来。
只要第一个请求启动了应用程序......即使没有访问者在网站上,这个方法也会每60分钟触发一次。