在ASP.NET中安排任务

我正在尝试创建一个每天运行两次的任务调度程序。 我已经使用CacheItemRemovedCallaback实现了一个任务调度程序,正如本文和本博客所述 。 我有一个function,使管理员能够修改计划的时间,并将它们保存在应用程序变量上:

protected void UpdateSchedule(object sender, EventArgs e) { Button button = sender as Button; if (button.ID == "scheduleButton1") { Application.Lock(); Application["buildSchedule1"] = GetScheduleTime1; Application.UnLock(); } else if (button.ID == "scheduleButton2") { Application.Lock(); Application["buildSchedule2"] = GetScheduleTime2; Application.UnLock(); } HttpRuntime.Cache.Remove(Global.DummyCachekey); //remove current scheduled task and set new time } 

在Global.aspx上我有:

 protected void Application_Start(object sender, EventArgs e) { Application.Lock(); Application["buildSchedule1"] = new TimeSpan(10,00, 0); //default time Application["buildSchedule2"] = new TimeSpan(16,00, 0); //default time Application.UnLock(); SheduleTask(); }; 

问题是由于某种原因(可能是由于应用程序池回收),计划时间会重置,甚至有时候任务也不会在默认时间启动。

我找到了提及Windows服务或Windows任务调度程序的解决方案,但这对我不起作用,因为我需要能够让管理员通过Web应用程序配置时间。 (我搜索这个,但找不到任何东西)。

我找到了提到Windows服务或Windows任务调度程序的解决方案

这就是你应该使用的东西。 Web应用程序不会“始终运行”。 它响应请求,就是这样。 除非某些东西正在积极向网站提出请求,否则它没有做任何事情。

但这对我不起作用,因为我需要让管理员通过Web应用程序配置时间

当然可以。 多个应用程序可以共享一个数据库。 在这种情况下,您有两个应用程序:

  • 用户可以登录和维护与计划任务相关的数据的Web应用程序。
  • Windows服务(或计划的控制台应用程序),它在服务器的后台运行,并执行从数据库中读取的已配置任务。

使用像Windows计划任务和控制面板function这样的黑客不是很好的解决方案。 他们大部分时间都很糟糕,他们很头疼。

您可以使用ATrigger调度服务。 .Net库也可用于创建计划任务而无需开销。

 //Tags: Tags are required to identify tasks. //read more at: http://atrigger.com/docs/wiki/9/rest-api-v10-parameter-tag_ Dictionary tags = new Dictionary(); tags.Add("type", "test"); //Create ATrigger.Client.doCreate(TimeQuantity.Hour(), "12", "http://www.example.com/myTask?something", tags); 

免责声明:我是ATrigger团队的一员。 这是一个免费软件,我没有任何商业目的。