计时器最大间隔

本文关键字:计时器 | 更新日期: 2023-09-27 18:25:25

使用系统。Windows。Form.Timer间隔是int,它给出了大约25天的最大间隔限制。我知道一旦达到极限,我可以创建一些任意的算法来启动另一个计时器,但这太愚蠢了。

MISLEADING-GNORE->那么,如果我想将其设置为大约29天(2619609112.7228003)毫秒&lt--错误引导-GNORE

编辑:

这里真正的问题是如何设置System。Windows。Form.Timer设置为高于maxInt的值?

目的是我需要设置一个从何时到下个月的第一天的间隔,因此可以是28、29、30或31天,当该间隔到期时,计算到下一个月的第一天的间隔。

(基本上,Crystal Report将在每月的第一天运行并打印(约500页),因为报告的长度太长,它将耗尽时间,因此不会占用打印机。)

例如,今天运行(今天是1/12/15),1/1/16是下一个"月的第一天",因此将时间间隔设置为从现在到那时的毫秒。

1/16到来,因此计时器滴答作响,然后计算并设置2016年1月2日(下一个月的第一天)的间隔。

@SeeSharp-我确实看到了这个问题,但我正在开发一个遗留应用程序,不确定更改计时器的含义,但如果我不能让这个计时器工作,我可以看看线程计时器,谢谢。

EDIT2:感谢您的所有建议,我选择了一个名为FluentScheduler 的第三方插件

计时器最大间隔

将计时器间隔设置为一天(例如),并使用它来计算最多29天的天数。

编辑

将计时器设置为半天(比如),并使用它来检查日期是否为本月的第一天。

一个月计时器怎么样?当月份发生变化时,它会在接近午夜时启动。这可能更符合你的要求吗?如果我们也必须考虑日间照明,那么计时器可能应该在月1日凌晨2:00启动,所以我会进行配置。

这里有一个代码来解释我的想法-

   public class MonthTimer : IDisposable
{
    public event EventHandler<MonthChangedEventArgs> MonthChanged;
    DateTime mLastTimerDate;
    Timer mTimer;
    public MonthTimer(TimeSpan timeOfFirstDay)
        : this(DateTime.Now, timeOfFirstDay)
    {
    }
    public MonthTimer(DateTime currentDate, TimeSpan timeOfFirstDay)
    {
        mLastTimerDate = currentDate.Date;
        var milliSecondsInDay = new TimeSpan(1, 0, 0, 0).TotalMilliseconds;
        Contract.Assert(timeOfFirstDay.TotalMilliseconds <= milliSecondsInDay); // time within 1st day of month            
        DateTime currentDateLastSecond = currentDate.Date.AddDays(1).AddTicks(-1);  // one tick before midnight 
        TimeSpan timeSpanInCurrentDate = currentDateLastSecond.Subtract(currentDate); // remaining time till today ends
        // I want the timer to check every day at specifed time (as in timeOfFirstDay) if the month has changed 
        // therefore at first I would like timer's timeout to be until the same time, following day
        var milliSecondsTillTomorrow = (timeSpanInCurrentDate + timeOfFirstDay).TotalMilliseconds;
        // since out milliseconds will never exceed - . Its okay to convert them to int32
        mTimer = new Timer(TimerTick, null, Convert.ToInt32(milliSecondsTillTomorrow), Convert.ToInt32(milliSecondsInDay));
    }
    private void TimerTick(object state)
    {
        if(DateTime.Now.Month != mLastTimerDate.Month)
        {
            if (MonthChanged != null)
                MonthChanged(this, new MonthChangedEventArgs(mLastTimerDate, DateTime.Now.Date));
        }
        mLastTimerDate = DateTime.Now.Date;
    }

    public void Dispose()
    {
        mTimer.Dispose();
    }
}
public class MonthChangedEventArgs : EventArgs
{
   public MonthChangedEventArgs(DateTime previousMonth, DateTime currentMonth)
    {
        CurrentMonth = currentMonth;
        PreviousMonth = previousMonth;
    }
   public DateTime CurrentMonth
    {
        get;
        private set;
    }
   public DateTime PreviousMonth
   {
       get;
       private set;
   }
}

客户端代码

    // Check the new month around 2 AM on 1st day
        mMonthTimer = new MonthTimer(new TimeSpan(2, 0, 0));
        mMonthTimer.MonthChanged += mMonthTimer_MonthChanged;

有一点我没有使用System.Threading.Timer,因此偶数处理程序将在单独的线程上调用&而不是像System.Windows.Forms.Timer那样的UI线程,如果这是你的情况下的一个问题,请告诉我。

如果它符合您的目的或任何问题,也请给我写一条评论

试试微软的Reactive Framework(NuGet"Rx-Main")。

你可以这样写:

Observable
    .Timer(DateTimeOffset.Now.AddDays(29.0))
    .Subscribe(x =>
    {
        /* 29 Days Later */
    });