【问题标题】:.NET DateTime object not very accurate?.NET DateTime 对象不是很准确?
【发布时间】:2011-01-13 17:42:37
【问题描述】:

我目前正在尝试编写一些代码来向设备发送请求,然后等待响应。问题是响应没有结束字符来指示消息已完成,因此我们只需要等待一段时间。

我要做的是发送消息,然后等待一段时间。每次有一条数据到达时,我都想增加等待的时间,比如再增加 100 毫秒,以防有更多数据要跟踪。如果在那段时间之后没有任何消息进入,则假定消息已完成。 这是我想出的伪代码:

var waitTime

Function SendData(data)
{
     send the request here and then block with the next code

     while (waitTime)
     {
          //wait
     }
}

Function RecieveData(data)
{
     Assign new data to a buffer
     waitTime++
}

SendData 和 RecieveData 函数都在一个类中的不同线程上。我正在用 C# 编写代码。我曾尝试使用 DataTime 对象来实现这一点,但在使用 10 毫秒/100 毫秒时它似乎不是很准确?

任何关于什么是最好的实现方式的建议都将不胜感激!

问候 阿德里安

【问题讨论】:

标签: c#


【解决方案1】:

考虑使用stopwatch class 来测量诸如此类的小增量。

【讨论】:

    【解决方案2】:

    DateTime精确到大约 1/64 秒。

    你为什么不直接使用System.Threading.Thread.Sleep(milliseconds)

    【讨论】:

    • 如前所述,我已经尝试通过睡眠来实现这一点,但是数据的大小会有所不同,因此当有新数据进来时,我们希望增加等待时间,以防有更多数据要跟进。
    • 所以每次数据到达时增加睡眠量。请注意,您可以指定休眠多长时间,这可以是一个变量,您可以根据需要修改该变量。
    【解决方案3】:

    尝试比较 DateTime.Ticks。一个滴答声是 100 纳秒。它与系统时钟一样准确。当然,两台计算机之间的差异可能是巨大的(相对而言)。

    【讨论】:

    • 时钟的准确度无关紧要;相关的是精度。精确到大约 1/64 秒。
    • 您好,感谢您的快速回复!我已经尝试使用 Thread.Sleep() 来实现这一点,但是我需要能够在每次有新数据进入时增加睡眠时间,以防有更多数据需要跟踪。我想我可以休眠,然后检查布尔值是否设置为多休眠一点?
    • @Adrian: 好的,那么每次有新数据进来时增加休眠时间。Sleep 以休眠时间长度为参数;根据需要增加参数的值。 (请注意,时间是近似。操作系统不保证你会恰好睡那么久。)
    • 好吧,我将使用 Thread.Sleep 并使用全局变量来增加睡眠时间。初始睡眠后我会检查睡眠时间是否被DataIn方法增加了,如果是,它会再次睡眠。
    【解决方案4】:

    如果你想休眠一段时间,只需使用 Thread.Sleep(10000) 这会导致线程休眠你想要的毫秒数。

    【讨论】:

      【解决方案5】:

      好的,为了结束这个问题,我想我会发布我的解决方案:

      bool dataInFlag;
      
      function sendData(data)
      {
           Send();
      
           dataInFlag = true;
      
           while(dataInFlag)
           {
                 dataInFlag = false;
                 Thread.Sleep(400);
           }
      }
      
      function recieveData(data)
      {
           Parse();
           dataInFlag = true;
      }
      

      所以简而言之,while循环将执行,将dataInFlag设置回false然后休眠,如果在sleep期间没有接收到数据,while循环将退出。如果接收到数据,则 dataInFlag 被设置回 true 并且循环将再次触发! 我对此进行了扩展,以便第一次执行的 while 循环休眠更长的时间,而每个后续循环的休眠时间更短。

      再次感谢所有回复。

      【讨论】:

        猜你喜欢
        • 2015-03-25
        • 1970-01-01
        • 1970-01-01
        • 2021-05-27
        • 1970-01-01
        • 2011-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多