Asp.net 中的全局计时器
Posted
技术标签:
【中文标题】Asp.net 中的全局计时器【英文标题】:Global Timer in Asp.net 【发布时间】:2010-10-29 17:13:11 【问题描述】:我想要一个 ASP.net 应用程序的计时器,该应用程序将在每个星期天晚上启动并执行某些操作(更新数据库中的表)。但是,我真的不想编写除了 Web 应用程序之外还必须部署在服务器上的服务。有没有办法轻松完成这项工作?也许使用 Global.asax 文件?
【问题讨论】:
我不认为网络应用程序是解决此问题的正确工具,但如果您继续进行一个重要的考虑:如果您计划您的应用程序在如此长的时间内启动,请关闭 IIS 回收! 重复:***.com/questions/542804/… @mausch 很好的发现...我最终探索了这个问题并找到了blog.***.com/2008/07/easy-background-tasks-in-aspnet,这似乎是对我来说最好的解决方案。 【参考方案1】:试试Quartz .NET,一个用于 .NET 企业应用程序(例如 ASP .NET)的作业调度程序,这应该可以满足您的目的。
【讨论】:
【参考方案2】:似乎最好的解决方案是使用this technique。如果我对服务器有更多的控制权,我可能会编写一个控制台应用程序来利用计划任务。
【讨论】:
这是迄今为止最好的例子。其他所有评论都依赖于页面访问。 这很漂亮【参考方案3】:针对您对计划任务的评论:
另一个技巧是覆盖 Global.asax 中的一个事件,这个事件通常被称为 Application_EndRequest() 并执行类似的操作:
protected void Application_EndRequest()
if (((DateTime)Application["lastTimeRun"]) < DateTime.Today)
Application["lastTimeRun"] = DateTime.Today;
doSomething();
这将在日期更改后的第一个请求之后运行,因此您不能保证它会在每天早上 3:00 准确运行。
我什至发现了你会在另一台计算机上使用计划任务访问网站的案例。
【讨论】:
【参考方案4】:我会编写一个控制台应用程序并使用 Scheduled Tasks 来安排它。
【讨论】:
如果我要完全控制服务器,计划任务将是理想的……不幸的是,我没有。我会投票赞成你的答案,只是为了提高对这个选项的认识。 其实这是一个hack,我喜欢这个hack,但它是一个hack。我用另一个你可以尝试的技巧添加了另一个答案。不幸的是,我不认为 ASP.NET 直接支持你想做的事情。【参考方案5】:我不认为 .NET 应用程序可以很好地解决您的问题。
IIS 回收将每隔几个小时回收一次进程(取决于设置),即使您将该间隔设置为 7 天,应用程序池仍可能因您无法控制的其他原因而被回收。
我同意 jcrs3:只需编写一个小控制台应用程序并使用调度程序即可。您也可以编写服务,但如果您需要快速简单的东西,请使用控制台应用程序。
【讨论】:
【参考方案6】:我不能 100% 确定 你会把它放在哪里,但使用 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 服务来处理这个问题很容易。
【讨论】:
在您的示例中放置计时器的最佳位置似乎是 Global.asax 文件的 Application_Start 处理程序。 您肯定必须执行检查以确保此计时器尚未运行。我已经看到有人在使用这个示例并产生了数千个线程,因为他们将其连接到 Application_Start 事件处理程序中。以上是关于Asp.net 中的全局计时器的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET Core 2.1 中的计时器上运行 BackgroundService
需要根据 asp.net mvc 应用程序中的计时器更新单例变量