ASP.NET中的计时器类

时间:2010-01-02 21:21:39

标签: asp.net timer

我在asp.net应用程序启动evert中有这个代码,我对Timer类并不熟悉,但我想要做的是每天晚上11点有一个触发器,一个关闭早上5:30,然后每小时一次。

private System.Threading.Timer timer;
protected void Application_Start(object sender, EventArgs e)
{

    int intervalMilliseconds = 60 * 1000; 
    timer = new System.Threading.Timer(new System.Threading.TimerCallback(TimedEvent), null, intervalMilliseconds, intervalMilliseconds);
}
protected void Application_End(object sender, EventArgs e)
{
    if (timer != null) timer.Dispose();
}
private void TimedEvent(object stateInfo)
{
    MyClass.ExecuteCode();

}

*请不要回答“不要因为生命周期而使用asp.net来做触发器”。 *再次 - 请不要发布什么不使用的帖子。我收到了两个帖子,告诉我什么不使用,两者都与我的问题无关,关于Timer类以及如何使用它。

5 个答案:

答案 0 :(得分:2)

根据您的问题,我假设您无法完全控制您的托管环境,因此会尽量避免安排它等等。

话虽如此,您仍然需要了解asp.net生命周期,并且您的触发方法充满了危险。

您是否获得足够的流量,应用程序不会意外结束?你知道IIS的配置吗,所以回收不用担心吗?

我可以看到三种方法:

我建议有一个页面,它使用某种键,这是唯一已知的 由来电者。将此页面由watchmouse(请参阅:http://www.watchmouse.com/en/)或计算机/服务器上的计划爬虫(在您需要触发它时始终打开)触发。

另一种方法是触发数据库进程,该进程在需要时运行。 根据您的环境,也可以安排。

另一种方法是检查日志文件,访问该页面的用户,如果它是一小时内的第一次访问,则触发您的进程。 (无论你需要什么时间,都要这样做。)
但是,这完全取决于您的网站访问量有多大,并且可能无法可靠地运行。

答案 1 :(得分:0)

当您创建计时器并挂钩其tick / elapsed事件时,请将间隔设置为每5分钟左右。

然后在tick / elapsed事件处理程序中,检查当前时间并在必要时执行操作。显然你还需要记录actino的执行时间,这样你就不会在10:58和晚上11点03分执行它。

答案 2 :(得分:0)

查看Quartz.NET,这将允许您设置类似cron的触发器。

答案 3 :(得分:0)

也许以不同的方式做你想做的事情:也许你可以只使用Windows调度程序来安排你的活动,而不是依赖于ASP。它具有您想要的更多调度功能,并且可能更加可靠,并且已经过调试。您的定时事件可以像访问http://localhost/YourApp/一样简单.aspx。您将获得相同的效果,如果您的应用程序恰好已经回收,您的活动仍将作为第一个请求执行。

答案 4 :(得分:0)

您可以使用内置的ASP.NET Cache.Add CacheItemRemovedCallback委托来执行您所描述的事情。这是一种使用它的迂回方式,但你可以这样做有效的调度。

有一篇文章here展示了如何做到这一点。

有关CacheItemRemovedCallback here的更多信息。

编辑:我知道您说没有服务,但是如果您检查服务器并发现可以使用预定任务,您可以使用它来按特定时间表运行控制台应用程序,就像其他其他服务一样答案提到。