【问题标题】:Maximum Timer interval最大定时器间隔
【发布时间】:2009-10-26 13:28:35
【问题描述】:

定时器的最大间隔为 2,147,483,647。大约 25 天。但在我的要求中,我需要计时器将等待 30 天。我该如何解决?请帮忙。

【问题讨论】:

  • 哪个定时器?? .NET 中至少有 3 个不同的计时器!
  • 顺便说一句,这不是一个错误。错误是您的代码和您的规范不一致。我想你会发现这是一个有据可查的限制。
  • 您可以可靠地期望您的流程运行 30 天吗?听起来像一个片状的方法。这种长时间运行的进程应该是独立于进程的......状态应该从一个进程的结束持续到下一个进程的开始。
  • @Rex 也许它会在机器熬夜一个月时安排一个特别的庆祝活动.. ;)
  • @Rex,我为 System.Threading.Timer 制作了一个包装器,它没有 2*32 毫秒(大约 49 天)的限制。我使用它的一个地方是在服务器程序启动期间启动一个计时器,该计时器将在客户许可证到期时触发。这可能在两天或两年内。现在,服务器是否实际运行两年都没有关系 - 当服务器重新启动时,我的程序将重新启动并使用新的到期时间计算重新启动计时器。但对于可以运行很长时间的计时器来说,它是一个简单而有用的应用程序。

标签: c# .net


【解决方案1】:

为此使用System.Threading.Timer。对于dueTime,有些构造函数采用longuintTimeSpan 而不是int。其中任何一个都可以让您设置 30 天的期限。

更新:这是最简单的方法:

System.Threading.Timer _timer;
public void Start30DayTimer()
{
    TimeSpan span = new TimeSpan(30, 0, 0, 0);
    TimeSpan disablePeriodic = new TimeSpan(0, 0, 0, 0, -1);
    _timer = new System.Threading.Timer(timer_TimerCallback, null, 
        span, disablePeriodic);
}

public void timer_TimerCallback(object state)
{
    // do whatever needs to be done after 30 days
    _timer.Dispose();
}

【讨论】:

  • 现在您只需让您的系统保持健康和快乐 30 天。
  • @Henk:这个问题没有说明为什么计时器的周期需要为 30 天。据我们所知,此计时器可用于向某人发送一封电子邮件,内容是“嘿,此服务器已连续运行 30 天”。
  • 30 天,是的。但最大值约为 49 天,因为即使您使用 int64 或 TimeSpan 版本,它也不接受超过 2*32-2 毫秒的值。
  • @RenniePet:你的意思是Timer 的构造函数会在 TimeSpan 值超过 49 天时抛出异常吗?因为 TimeSpan 可以保持比 49 天更长的时间间隔。
  • 没错。你会得到一个“ArgumentOutOfRangeException”,文本是“超时间隔必须小于 2^32-2。”
【解决方案2】:
int days = 30;

为某一天创建一个计时器。

每次定时器触发时减少days

【讨论】:

  • 我同意。计时器并不是真的要处理长达 30 天的时间段,尽管我会让我的计时器每天运行不止一次。
  • System.Threading.Timer 被限制为大约 49 天(2*32 毫秒),即使使用 int64 和 TimeSpan 版本也是如此。因此,对于长时间使用的通用计时器来说,这样的方法是一种有效的方法。
【解决方案3】:

您始终可以让计时器等待更短的时间,例如一天,每次计时器触发时都会增加一个计数器并检查计数器的当前值。如果值为 30,则执行应该每 30 天运行一次的代码。

一个更好的主意是在外部文件中的某个位置设置值,这样如果程序意外退出,您可以从中断的地方继续。理想情况下,您可能希望将下一次运行日期放入文件中,这样如果程序关闭多天,您可以恢复并让它在正确的日期触发,而不必担心上次运行的时间。所以像

NextRunDate = 2009 年 10 月 10 日下午 4:40

当程序运行时,它将日期提前 30 天。

【讨论】:

    【解决方案4】:

    这是一个计时器,告诉您您的应用程序被更恰当地实现为计划任务。

    【讨论】:

      【解决方案5】:

      我强烈建议使用 Windows Scheduled Task 功能,特别是如果它打算在每个月的同一天运行某些东西,因为月份在 28 到 31 天之间变化。

      【讨论】:

      • 这不是问题的答案。如果您在给定时间(调度程序)启动应用程序,或者如果您正在运行的应用程序在给定时间(计时器)执行某项操作,那么情况就完全不同了。
      【解决方案6】:

      当您想要执行任何内容时,将日期时间变量设置为日期时间...然后让计时器每分钟检查一次(或任何您所需的准确度级别)以查看该日期时间是否已经过去...

      【讨论】:

        【解决方案7】:

        要使用计时器来做到这一点,您还需要一个应用程序和一台可以不间断运行 30 天以上的 PC。并非不可能,但风险很大。

        听起来您想要按计划执行某事。计算目标日期/时间并将其保留为 XML 或 .config 文件。当应用程序重新启动时,它可以重新计算触发事件的时间跨度。

        【讨论】:

          【解决方案8】:

          Quartz.NET 库是按计划运行代码的另一种选择。

          【讨论】:

            【解决方案9】:

            计时器构造函数将采用一个 TimeSpan,它是 int64 滴答,肯定超过 25 天?

            您是否也考虑过系统可能不会保持 30 天?

            刚刚查了一下,是 10,675,199 天。

            【讨论】:

              猜你喜欢
              • 2016-03-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-11-27
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多