【问题标题】:Evaluating DateTime.Now.Millisecond in a loop - C#在循环中评估 DateTime.Now.Millisecond - C#
【发布时间】:2014-09-26 15:59:41
【问题描述】:

我是编程新手。我正在尝试使用System.Timer 以毫秒为单位评估时间,以在current time 匹配past time + a number of milliseconds(满足未来条件)时打破while 循环。

有时它会成功退出循环,但有时它会作为无限循环运行。我认为这与毫秒时钟精度有关,但我不确定。变量的控制台输出显示timeFuture 是正确的。

我查看了Timespan,但不知道如何使用它。非常感谢您的任何反馈。

long end = 500;  //500 milliseconds
long timeStart = DateTime.Now.Millisecond;  //time in milliseconds
long timeFuture = timeStart + end;
long timeNow = 0;

while (true)
{
    timeNow = DateTime.Now.Millisecond;              
    if (timeFuture - timeNow == 0) { break; }             
    Console.WriteLine(timeNow);
}

【问题讨论】:

  • 既然你知道使用计时器,为什么还要这样做而不是使用Timer
  • 如果您能够每毫秒进行一次比较,您的算法理论上会起作用,但由于速度有限、多任务处理、准确性等原因,您无法做到这一点。最简单的解决方法是比较 '
  • @Servy - 作为一个实验 - 我真正的兴趣是了解 Ableton 等音乐音序器如何​​使用时间,他们的技术是什么。但在这个阶段,我在编程和接触对我来说真的太高级的主题方面也是一个完全的初学者——所以我正在涉足新手的东西以及阅读其他的东西

标签: c# timer milliseconds


【解决方案1】:

DateTime.Now.Milisecond 不返回以毫秒为单位的时间,而是返回 DateTime 实例所代表的时间点的实际毫秒(因此它始终介于 0 和 999 之间)。此外,当您在多线程系统上运行时,您的条件可能永远不会在它评估为 true 的确切时间点执行(写入控制台也会消耗时间)。

所以你可以考虑改变你的条件并使用Timespan类:

DateTime timeStart = DateTime.Now;

while (true)
{
  DateTime timeNow = DateTime.Now;
  TimeSpan difference = (timeNow - timeStart);
  if (difference.TotalMilliseconds >= 500) { break; }
  Console.WriteLine(timeNow);
}

【讨论】:

  • 谢谢,这回答了很多!我知道从 999 回到 0 会有一个问题(因为它在整个日期都起作用)但不确定如何实现 TimeSpan 类。还有一个问题是没有一个确切的点,但是这如何与多线程联系在一起......这现在我头疼。
【解决方案2】:

毫秒是时间的组成部分,而不是时间跨度。你想要类似的东西

    DateTime start = DateTime.Now;
    while (true)
    {

        if ((DateTime.Now - start ).TotalMilliseconds>500) // Is a timespan
          { break; }             
        Console.WriteLine(timeNow);
    }

【讨论】:

    猜你喜欢
    • 2011-12-17
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 2018-06-23
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    相关资源
    最近更新 更多