我在一个asp.net网站中使用以下代码。
在应用程序初始化时,我调用InitializeTimer()一次。
该代码的目标是每个小时运行DoWork()一次。
我还希望代码在每个循环中以不同的时间执行,因此我添加了随机部分。
我得到的结果很奇怪,我找不到为什么会发生的解释。
代码在2小时后执行函数,然后再次在2小时后执行,然后在3小时后执行,然后在2小时后又执行了2小时。****
有人能解释原因吗?
在应用程序初始化时,我调用InitializeTimer()一次。
该代码的目标是每个小时运行DoWork()一次。
我还希望代码在每个循环中以不同的时间执行,因此我添加了随机部分。
我得到的结果很奇怪,我找不到为什么会发生的解释。
代码在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();
}
更新:
请勿发布“使用Windows服务”或“计划任务”的帖子。 我的问题是针对以下代码的,我不需要更好的替代方案。 此外,在此测试期间(10小时),网站访问量很高,IIS池没有重新启动!
根据以下MSDN:(http://msdn.microsoft.com/en-us/library/system.timers.timer.interval.aspx)
如果在Timer启动后设置时间间隔,则计数将被重置。例如,如果将时间间隔设置为5秒,然后将Enabled属性设置为true,则计数从设置Enabled的时间开始。如果在计数为3秒时将时间间隔重置为10秒,则Elapsed事件第一次在Enabled设置为true后的13秒引发。
重置Elapsed函数中的间隔是否可能导致问题?
这意味着当调用tTimer_Elapsed函数时,计数为1小时(减去几毫秒), 而我的代码“tTimer.Interval + = random.Next(-5,5);”会将另一个完整的小时添加到Interval中吗?