1

我正在尝试创建一个每天运行两次的任务调度程序。我已经使用 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 应用程序配置时间。(我搜索这个,但找不到任何东西)。

4

2 回答 2

2

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

这就是你应该使用的。Web 应用程序不会“始终运行”。它响应请求,仅此而已。除非有东西主动向网站发出请求,否则它不会做任何事情。

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

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

  • 用户可以登录并维护与计划任务相关的数据的 Web 应用程序。
  • 一个 Windows 服务(或计划的控制台应用程序),它在服务器的后台运行并执行它从数据库中读取的配置任务。
于 2013-08-14T22:34:31.387 回答
0

使用诸如 Windows 计划任务和控制面板功能之类的技巧并不是很好的解决方案。他们大部分时间都很糟糕,他们很头疼。

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

//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 团队中的一员。这是一个免费软件,我没有任何商业目的。

于 2013-08-26T14:10:50.643 回答