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

RuS*_*uSh 11 .net c# asp.net timer

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

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

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

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

我得到的结果是werid,我找不到解释为什么会发生.

代码在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();
}
Run Code Online (Sandbox Code Playgroud)

更新:

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

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

如果在定时器启动后设置了间隔,则重置计数.例如,如果将间隔设置为5秒,然后将Enabled属性设置为true,则计数将在Enabled设置时开始.如果在计数为3秒时将间隔重置为10秒,则在Enabled设置为true后,Elapsed事件将首次提升13秒.

是否有可能重新设置已用功能的间隔是导致问题的原因?

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

Sam*_*eff 5

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

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


mpe*_*son 3

看看这个……杰夫·阿特伍德实际上讨论过类似的事情。我想这确实有效,但根据杰夫的说法,该网站已经无法满足这种方法的需求,因此他们开始执行一项专门的任务。