问题 在asp.net中使用System.Timers.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();
}

更新:

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

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

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

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

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


7693
2018-02-12 22:25


起源

如果取出随机部分,代码是否按预期工作? - mpeterson
我不知道,代码在生产服务器上运行,我现在无法改变它(不会有几天),这就是为什么我问这个问题找到解释。 - RuSh
那么这是否意味着它在本地测试时按预期执行? - mpeterson


答案:


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


4
2018-02-13 01:32





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

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


5
2018-02-12 22:31



thx为输入。测试期间未重新启动网站或iis池。我相信我的代码有问题。 - RuSh
@sharru IIS无需用户干预即可回收您的应用程序。 - Jader Dias
我知道这一点,我记录这些事件,没有重启。 - RuSh


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


1
2018-02-12 23:50





从.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突然终止工作进程,直到所有   后台工作项目已完成。


1
2018-06-04 00:04