我希望有一个ASP.net应用程序的计时器,它将在每个星期天晚上启动并执行某些操作(更新数据库中的表)。但是,除了Web应用程序之外,我真的不想编写必须部署在服务器上的服务。有没有办法轻松实现这一目标?也许使用Global.asax文件?
答案 0 :(得分:9)
似乎最好的解决方案是使用this technique。如果我对服务器有更多控制权,我可能会编写一个控制台应用程序来利用计划任务。
答案 1 :(得分:4)
我不是百分百肯定你会把它放在哪里,但使用System.Threading.Timer会撼动它。
// In some constructor or method that runs when the app starts.
// 1st parameter is the callback to be run every iteration.
// 2nd parameter is optional parameters for the callback.
// 3rd parameter is telling the timer when to start.
// 4th parameter is telling the timer how often to run.
System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(TimerElapsed), null, new Timespan(0), new Timespan(24, 0, 0));
// The callback, no inside the method used above.
// This will run every 24 hours.
private void TimerElapsed(object o)
{
// Do stuff.
}
最初,您必须确定何时第一次启动计时器,或者您可以在周日晚上运行此计时器时打开网站。
但正如其他人所说,使用网站以外的其他内容来做到这一点。制作Windows服务来处理这个问题很容易。
答案 2 :(得分:3)
我会编写一个控制台应用程序并使用计划任务来安排它。
答案 3 :(得分:1)
尝试使用Quartz .NET作为.NET企业应用程序(如ASP .NET)的作业调度程序,这应该可以满足您的需求。
答案 4 :(得分:0)
我认为.NET应用程序不是解决问题的好方法。
IIS回收将每隔几个小时回收一次该进程(取决于设置),即使您将该时间间隔设置为七天,仍然可以回收应用程序池,原因是您无法控制的其他原因。
我同意jcrs3:只需编写一个小控制台应用程序并使用调度程序。您也可以编写服务,但如果您需要快速简便的方法,请使用控制台应用程序。
答案 5 :(得分:0)
回应您对计划任务的评论:
另一个黑客是覆盖 Global.asax 中的一个事件,这个事件通常被称为 Application_EndRequest(),并执行类似的操作:
protected void Application_EndRequest()
{
if (((DateTime)Application["lastTimeRun"]) < DateTime.Today)
{
Application["lastTimeRun"] = DateTime.Today;
doSomething();
}
}
这将在更改日期后的第一个请求之后运行,因此您无法保证每天早上凌晨3:00准确运行。
我甚至会在另一台计算机上使用预定任务来点击网站。