Хотя делать это в веб-приложении не идеально. это достижимо , учитывая, что сайт всегда работает.
Вот пример: я создаю элемент Cache в global.asax с истечением срока действия. Когда он истекает, событие запускается. Вы можете получить свои данные или что-либо еще в событии OnRemove ().
Затем вы можете установить вызов страницы (желательно очень маленькой), которая будет вызывать код в Application_BeginRequest, который добавит элемент Cache с истечением срока действия.
global.asax:
private const string VendorNotificationCacheKey = "VendorNotification";
private const int IntervalInMinutes = 60; //Expires after X minutes & runs tasks
protected void Application_Start(object sender, EventArgs e)
{
//Set value in cache with expiration time
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();
//Need Access to HTTPContext so cache can be re-added, so let's call a page. Application_BeginRequest will re-add the cache.
var siteUrl = ConfigurationManager.AppSettings.Get("SiteUrl");
var client = new WebClient();
client.DownloadData(siteUrl + "default.aspx");
client.Dispose();
}
private void SendVendorNotification()
{
//Do Tasks here
}
protected void Application_BeginRequest(object sender, EventArgs e)
{
//Re-add if it doesn't exist
if (HttpContext.Current.Request.Url.ToString().ToLower().Contains("default.aspx") &&
HttpContext.Current.Cache[VendorNotificationCacheKey] == null)
{
//ReAdd
CacheItemRemovedCallback callback = OnRemove;
Context.Cache.Add(VendorNotificationCacheKey, DateTime.Now, null, DateTime.Now.AddMinutes(IntervalInMinutes), TimeSpan.Zero,
CacheItemPriority.Normal, callback);
}
}
Это хорошо работает, если запланированное задание выполняется быстро.
Если это длительный процесс ... вам определенно нужно не допускать его в свое веб-приложение.
Пока 1-й запрос запустил приложение ... оно будет срабатывать каждые 60 минут, даже если у него нет посетителей на сайте.