C# 在System.Threading.Timer过期后,DateTime.UtcNow是否可能报告错误的时间?
我有一段代码,将当前时间(C# 在System.Threading.Timer过期后,DateTime.UtcNow是否可能报告错误的时间?,c#,datetime,timer,C#,Datetime,Timer,我有一段代码,将当前时间(DateTime.UtcNow)记录为“截止日期”,设置一个System.Threading.Timer,当计时器过期时,检查是否已达到截止日期。它通过比较当前时间(DateTime.UtcNow)和记录的截止日期来执行此检查 下面是一个简化的代码示例,说明了该原理: class DeadlineChecker { private DateTime deadline; public DeadlineChecker() { int waitingTi
DateTime.UtcNow
)记录为“截止日期”,设置一个System.Threading.Timer
,当计时器过期时,检查是否已达到截止日期。它通过比较当前时间(DateTime.UtcNow
)和记录的截止日期来执行此检查
下面是一个简化的代码示例,说明了该原理:
class DeadlineChecker
{
private DateTime deadline;
public DeadlineChecker()
{
int waitingTimeInMilliseconds = 1200;
TimeSpan waitingTime = TimeSpan.FromMilliseconds(waitingTimeInMilliseconds);
this.deadline = DateTime.UtcNow + waitingTime;
System.Threading.Timer timer = new System.Threading.Timer(TimerElapsed);
timer.Change(waitingTimeInMilliseconds, Timeout.Infinite);
}
private void TimerElapsed(object state)
{
if (this.HasDeadlineBeenReached())
{
[...] // Do something
}
[...] // Cleanup (dispose timer etc.)
}
private bool HasDeadlineBeenReached
{
get
{
// This is only called from TimerElapsed(), so
// this should always return true, right?
return (this.deadline <= DateTime.UtcNow);
}
}
}
类死线检查器
{
私人日期时间截止日期;
公共死线检查器()
{
int waitingtimein毫秒=1200;
TimeSpan waitingTime=TimeSpan.FromMillics(WaitingTimeinMillics);
this.deadline=DateTime.UtcNow+waitingTime;
System.Threading.Timer Timer=新的System.Threading.Timer(TimeRecursed);
timer.Change(waitingtimein毫秒,Timeout.Infinite);
}
私有无效时间重复(对象状态)
{
if(this.HasDeadlineBeenReached())
{
[…]//做点什么
}
[…]//清理(处置计时器等)
}
二等兵布尔已经死了
{
得到
{
//这只从timeRecursed()调用,所以
//这应该是真的,对吧?
返回(this.deadline您写道:
// This should always return true, right?
不,只有在最后期限过去时,它才会返回真值。我很感激您创建了一个1200毫秒后的最后期限,然后告诉计时器在1200毫秒后启动,并期望最后期限在计时器启动的那一刻过去,但实际上计时器的计时和时钟的准确性是这样的,所以您可能会合理地观察您的代码没有在您期望的精确毫秒触发,时钟没有返回您期望的精确毫秒,因此您的截止日期仍然在代码运行的未来
我建议您调整计时策略;将计时器设置为您希望“准确”的时间间隔的一半,使用相同的逻辑检查您的截止日期是否在过去,并容忍不精确(不要向用户承诺他们可以以1毫秒的精度安排会议通知)运行此代码的机器是否设置为自动调整其时钟?UtcNow
取决于对计算机当前时间概念的任何更改。DateTime.UtcNow
或DateTime。现在
从操作系统检索它们的值。它们不受应用程序计时器的影响。尽管计时器不再受影响比操作系统定义的时间间隔(大约16.5毫秒)精确。DateTime
的精度也在14-16毫秒左右,因此您所做的不是很精确。问题是,您首先要做的是什么?为什么在计时器启动时检查挂钟?顺便说一句,需要处理计时器,因此当前的代码泄漏计时器已读取y、 @Damien_不信者这是一个很好的暗示,谢谢。