【问题标题】:Global Timer in Asp.netAsp.net 中的全局计时器
【发布时间】:2010-10-29 17:13:11
【问题描述】:

我想要一个 ASP.net 应用程序的计时器,该应用程序将在每个星期天晚上启动并执行某些操作(更新数据库中的表)。但是,我真的不想编写除了 Web 应用程序之外还必须部署在服务器上的服务。有没有办法轻松完成这项工作?也许使用 Global.asax 文件?

【问题讨论】:

标签: c# asp.net


【解决方案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 事件处理程序中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多