睡眠特有的滴答声

本文关键字:滴答声 | 更新日期: 2023-09-27 17:58:43

我需要一个函数来等待指定数量的DateTime.Ticks(约155 000)。不幸的是,它不能真正使用以下功能(等待了大约30万次滴答声):

private void sleep_ticks(long t)
{
    long _start = DateTime.Now.Ticks + t;
    int i = 0;
    do
    {
        i++;
        Console.WriteLine((DateTime.Now.Ticks - _start) + " => " + i);
        if (DateTime.Now.Ticks >= _start)
            break;
    } while (true);
    Console.WriteLine((DateTime.Now.Ticks - _start) + " < " + t + " -- " + i);
    Console.ReadLine();
}

我添加了一些调试输出:-)最后一个值必须接近0。

以下是sleep_ticks(1)的输出:

-1 => 1; -1 => 2; -1 => 3; -1 => 4; -1 => 5; -1 => 6; -1 => 7; -1 => 8; -1 => 9; -1 => 10; 
-1 => 11; -1 => 12; -1 => 13; -1 => 14; -1 => 15; -1 => 16; -1 => 17; -1 => 18; -1 => 19; 
-1 => 20; -1 => 21; -1 => 22; -1 => 23; -1 => 24; -1 => 25; -1 => 26; -1 => 27; -1 => 28; 
-1 => 29; 156262 < 1 -- 29;

有人知道为什么会这样,或者如何解决吗?

谢谢和问候Robert

睡眠特有的滴答声

"我需要一个函数,等待指定数量的DateTime.Ticks。"这是不可能的。

使用System.Threading.Thread.Sleep(int毫秒超时)来测量以毫秒为单位的等待精度。

// Puts the current thread to sleep for 15 milliseconds.
System.Threading.Thread.Sleep(15);

应注意的是,关于已接受的答案(https://stackoverflow.com/a/23134395/3076020)Thread.Sleep(TimeSpan)忽略分数毫秒。

"此睡眠过载使用了整个毫秒的超时总数。部分毫秒被丢弃。"如本文所述:https://msdn.microsoft.com/en-us/library/274eh01d(v=vs.110).aspx

这意味着,在提供Thread.Sleep时,在最短等待时间内将忽略半毫秒。利用TimeSpan的155000次滴答声。一毫秒内有10000个刻度,因此155000个刻度=15.5毫秒。虽然在等待15毫秒的情况下,这可能不会产生太大影响。在实际需要比毫秒更准确的刻度或某些测量的情况下,它可能会产生影响。这就是为什么在这种情况下,为了清晰起见,我建议使用整数(毫秒)过载。

如果使用毫秒是不适用的,我建议研究旋转线程。这意味着在通话之间反复检查一个合适的高分辨率计时器,使其保持活动/繁忙状态。即使这样也容易给出不准确的结果,因为操作系统可能会调度另一个优先级更高的线程,从而使时序发生偏差。


请注意线程。睡眠是使线程脱离调度程序、无法处理、睡眠的最短时间。线程可能最终"等待"恢复处理的时间超过指定时间。这个答案让我们更清楚地了解了为什么Thread.Sleep并不总是指定的时间。https://stackoverflow.com/a/6254753/3076020

关于一毫秒是10000个刻度的参考信息。我相信这是.NET中的标准配置,不能更改。https://msdn.microsoft.com/en-us/library/system.timespan.tickspermillisecond(v=vs.110).aspx

使用线程休眠

System.Threading.Thread.Sleep(new TimeSpan(155000));

这是暂停系统的命令,您应该能够在代码中实现它,使它也能满足您的需要。

System.Threading.Thread.Sleep(100);

如果我有100,你可以把它设置为你的DateTime.Now.Ticks,它应该仍然有效。

私有void TicksDriverSleepingThread(长Ticks){int imillisecondsTimeout;

        //  http://msdn.microsoft.com/en-us/library/system.datetime.ticks.aspx
        //A single tick represents one hundred nanoseconds or one ten-millionth of a second. There are 10,000 ticks in a millisecond. 
        //Convert Ticks to their Millseconds Equivalen
        imillisecondsTimeout = Convert.ToInt32((Ticks / 10000));
        while (true) 
        {
            //Wait
            Thread.Sleep(imillisecondsTimeout);
            //Do What Needs Doing
        }

    }