在asp.net中使用System.Timers.Timer

时间:2010-02-12 22:25:41

标签: c# .net asp.net timer

我在asp.net网站上使用以下代码。

在应用程序init上,我调用一次InitializeTimer()。

代码的目标是每小时运行一次DoWork()(每小时1次)。

我还希望代码在每个循环的不同时间执行,所以我添加了随机部分。

我得到的结果很糟糕,我找不到解释为什么会发生

代码在2小时后执行该功能,然后在2小时后再执行,然后在 3小时之后,然后在2小时后再执行2小时。****

有人可以解释原因吗?

using System.Timers;
....
private static random = new Random();
....
public static void InitializeTimer()
{
    tTimer = new Timer();
    tTimer.AutoReset = true;
    tTimer.Interval = TimeSpan.FromHours(1.0).TotalMilliseconds;
    tTimer.Elapsed += new ElapsedEventHandler(ClassName1.tMailer_Elapsed);
    tTimer.Start();
}

private static void tTimer_Elapsed(object sender, ElapsedEventArgs e)
{
    tTimer.Interval += random.Next(-5, 5);

    DoWork();
}

更新

  1. 请不要发布“使用Windows服务”或“预定任务”。 我的问题是以下代码我不是在寻找更好的选择。 此外,在此测试期间(10小时),网站流量很大,iis池没有重启!

  2. 基于以下MSDN:(http://msdn.microsoft.com/en-us/library/system.timers.timer.interval.aspx

  3.   

    如果在Timer之后设置了间隔   已经开始,计数被重置。对于   例如,如果将间隔设置为5   秒,然后设置启用   属性为真,计数开始于   已设置启用时间。如果你重置   计数时的间隔为10秒   是3秒,Elapsed事件是   第一次提升13秒   在Enabled之后设置为true。

    是否有可能在经过时间的功能中重新设置间隔是导致问题的原因?

    意思是当调用tTimer_Elapsed函数时,计数为1小时(最小几毫秒) 和我的代码“tTimer.Interval + = random.Next(-5,5);”正在向Interval添加另一个小时?

4 个答案:

答案 0 :(得分:5)

ASP.NET应用程序将在不使用时关闭。如果有人访问您的网站,然后没有更多的点击,它可能会被关闭。你的计时器不会开火。

对于此类维护工作,您希望使用Windows计划任务或Windows服务。

答案 1 :(得分:4)

检查this ...杰夫阿特伍德实际上讨论了类似的事情。我想这很有效,但根据Jeff的说法,网站已经超出了这个方法,所以他们去了一个专门的任务。

答案 2 :(得分:2)

从.net 4.5.2开始,有一个名为HostingEnvironment的类,它可以执行您要求的操作,以下是如何使用: https://blog.mariusschulz.com/2014/05/07/scheduling-background-jobs-from-an-asp-net-application-in-net-4-5-2

  

HostingEnvironment.QueueBackgroundWorkItem方法可以让你   安排小背景工作项目。 ASP.NET跟踪这些项目和   防止IIS突然终止工作进程,直到所有   后台工作项目已经完成。

答案 3 :(得分:1)

我的第二个Sams建议使用Windows预定任务每小时点击一页。我尝试过并尝试让我的工作起作用。我去了一个预定的任务,它从未失败。