在ASP.NET中安排任务

时间:2013-08-14 22:25:54

标签: c# asp.net scheduled-tasks

我正在尝试创建一个每天运行两次的任务调度程序。我已根据this postthis blog中的建议使用CacheItemRemovedCallaback实现了任务调度程序。我有一个功能,使管理员能够修改预定的时间,并将它们保存在应用程序变量上:

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应用程序配置时间。 (我搜索这个,但找不到任何东西)。

2 个答案:

答案 0 :(得分:2)

  

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

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

  

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

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

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

答案 1 :(得分:0)

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

您可以使用ATrigger日程安排服务。 .Net library也可用于创建计划任务而无需开销。

//Tags: Tags are required to identify tasks. 
//read more at: http://atrigger.com/docs/wiki/9/rest-api-v10-parameter-tag_
Dictionary<string, string> tags = new Dictionary<string, string>();
tags.Add("type", "test");

//Create
ATrigger.Client.doCreate(TimeQuantity.Hour(), "12", "http://www.example.com/myTask?something", tags);

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