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_不信者这是一个很好的暗示,谢谢。