代码之家  ›  专栏  ›  技术社区  ›  Darwyn

ASP.NET中的全局计时器

  •  7
  • Darwyn  · 技术社区  · 15 年前

    我想要一个ASP.NET应用程序的计时器,它将在每个星期天晚上启动并执行一些操作(更新数据库中的表)。但是,除了Web应用程序之外,我真的不想编写一个必须部署在服务器上的服务。有没有一种简单的方法可以做到这一点?可能使用global.asax文件?

    6 回复  |  直到 13 年前
        1
  •  9
  •   Darwyn    15 年前

    最好的解决办法似乎是 this technique . 如果我对服务器有更多的控制,我可能会编写一个控制台应用程序来利用预定的任务。

        2
  •  4
  •   Gromer    15 年前

    我不是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服务来处理这个问题非常简单。

        3
  •  3
  •   jrcs3    15 年前

    我会编写一个控制台应用程序并使用 计划任务 安排它。

        4
  •  1
  •   ddt99999    13 年前

    试试 Quartz .NET ,一个用于.NET企业应用程序(如ASP.NET)的作业调度程序,这应该符合您的目的。

        5
  •  0
  •   Stefan    15 年前

    我认为.NET应用程序不是解决您问题的好方法。

    IIS回收将每隔几个小时(取决于设置)回收一次进程,即使将该间隔设置为7天,应用程序池仍可以出于其他无法控制的原因进行回收。

    我同意JCRS3:只需编写一个小的控制台应用程序并使用调度器。你也可以写一个服务,但是如果你需要快速和简单的东西,使用控制台应用程序。

        6
  •  0
  •   jrcs3    15 年前

    响应您对计划任务的评论:

    另一个黑客方法是在 阿萨克斯全球公司 ,一个偶数通常被称为 应用程序结束请求() 做一些类似的事情:

    protected void Application_EndRequest()
    {
        if (((DateTime)Application["lastTimeRun"]) < DateTime.Today)
        {
            Application["lastTimeRun"] = DateTime.Today;
            doSomething();
        }
    }
    

    这将在更改日期后的第一个请求之后运行,因此您不能保证它将在每天早上3:00精确运行。

    我甚至为你在另一台计算机上使用预定任务访问该站点的情况下设置种子。