计时器最大间隔
本文关键字:计时器 | 更新日期: 2023-09-27 18:25:25
使用系统。Windows。Form.Timer间隔是int
,它给出了大约25天的最大间隔限制。我知道一旦达到极限,我可以创建一些任意的算法来启动另一个计时器,但这太愚蠢了。
MISLEADING-GNORE->那么,如果我想将其设置为大约29天(2619609112.7228003)毫秒<--错误引导-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 */
});