我正在尝试创建一个每天运行两次的任务调度程序。我已根据this post和this 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应用程序配置时间。 (我搜索这个,但找不到任何东西)。
答案 0 :(得分:2)
我找到了提及Windows服务或Windows任务调度程序的解决方案
这就是你应该使用的东西。 Web应用程序不会“始终运行”。它响应请求,就是这样。除非某些东西正在积极向网站提出请求,否则它没有做任何事情。
但这对我不起作用,因为我需要让管理员通过Web应用程序配置时间
确实如此。多个应用程序可以共享一个数据库。在这种情况下,您有两个应用程序:
答案 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团队的一员。这是一个免费软件,我没有任何商业目的。