我在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();
}
更新
请不要发布“使用Windows服务”或“预定任务”。 我的问题是以下代码我不是在寻找更好的选择。 此外,在此测试期间(10小时),网站流量很大,iis池没有重启!
基于以下MSDN:(http://msdn.microsoft.com/en-us/library/system.timers.timer.interval.aspx)
如果在Timer之后设置了间隔 已经开始,计数被重置。对于 例如,如果将间隔设置为5 秒,然后设置启用 属性为真,计数开始于 已设置启用时间。如果你重置 计数时的间隔为10秒 是3秒,Elapsed事件是 第一次提升13秒 在Enabled之后设置为true。
是否有可能在经过时间的功能中重新设置间隔是导致问题的原因?
意思是当调用tTimer_Elapsed函数时,计数为1小时(最小几毫秒) 和我的代码“tTimer.Interval + = random.Next(-5,5);”正在向Interval添加另一个小时?
答案 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预定任务每小时点击一页。我尝试过并尝试让我的工作起作用。我去了一个预定的任务,它从未失败。