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 应用程序中的计时器更新单例变量

asp.net 定时器 定时执行任务

ASP.NET 页面上的倒数计时器

用户单击 ASP.NET Web 表单上的按钮与计时器运行调用相同按钮单击事件的方法之间的区别?

如何使用 asp.net 创建 2 分钟倒数计时器