睡眠特有的滴答声
本文关键字:滴答声 | 更新日期: 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
}
}