.net线程.sleep不准确

.net线程.sleep不准确,.net,multithreading,sleep,.net,Multithreading,Sleep,我快疯了!!。 我通过gsm发送音频,根据语音规范,我必须发送语音数据包,然后等待20毫秒以获得正常语音。我使用system.threading.thread.sleep(20)。然而,我注意到声音很慢,但当我运行另一个不同的应用程序时,声音变得正常 经过一些调试,我发现system.Threading.Thread.Sleep(20)需要31毫秒,但是如果我运行另一个不同的应用程序,Thread.Sleep(20)将始终是准确的 为了让线程准确地休眠20毫秒,同时又不影响PC的性能,我还可以使

我快疯了!!。 我通过gsm发送音频,根据语音规范,我必须发送语音数据包,然后等待20毫秒以获得正常语音。我使用system.threading.thread.sleep(20)。然而,我注意到声音很慢,但当我运行另一个不同的应用程序时,声音变得正常

经过一些调试,我发现system.Threading.Thread.Sleep(20)需要31毫秒,但是如果我运行另一个不同的应用程序,Thread.Sleep(20)将始终是准确的

为了让线程准确地休眠20毫秒,同时又不影响PC的性能,我还可以使用哪些其他方法呢

谢谢,

Sleep(20)
意味着至少睡眠20毫秒。基本上,它会暂停线程,不会在指定的延迟内恢复调度。在这之后,线程仍然必须被调度以实际恢复运行。这取决于正在运行的其他线程可能是立即运行的,也可能是稍后运行的。这里没有保证

政府呼吁:

系统时钟以称为时钟分辨率的特定速率滴答作响。 实际超时可能与指定的超时不完全相同,因为 指定的超时将被调整为与时钟滴答声一致。 有关时钟分辨率和等待时间的更多信息,请参阅 睡眠功能主题。此方法从中调用Sleep函数 Windows系统API


如前所述,准确的计时通常需要一个不会被时间分割的线程/进程,要做到这一点,您必须
Spin
,而不是
Sleep

选项1

如果你想要绝对的准确度,我会使用一个带有秒表的高优先级线程

bool running = true;
Thread t = new Thread(() =>
{
    Stopwatch sw = Stopwatch.StartNew();
    while (running)
    {
        if (sw.ElapsedMilliseconds >= 20)
        {
            RunCode();
            sw.Restart();
        }
    }
}) { Priority = ThreadPriority.Highest, IsBackground = true };

t.Start();

// ...

running = false;
t.Join();
选项2

更纤细一点,不会在不同的线程上运行,但仍然可以旋转

while (true) 
{
    SpinWait.SpinUntil(() => false, TimeSpan.FromMilliseconds(20));
    RunCode();
}
选项3


一些开源的高分辨率定时器代码。e、 g.

如果你想获得准确的睡眠时间,你必须旋转等待,这对电脑性能不利。睡眠准确度由时钟中断率决定,默认情况下,它每秒滴答64次。每15.625毫秒一次。因此,睡眠(20)只有在两次滴答声过去后才能完成,2 x 15.625=31.25毫秒。中断率可以改变,浏览器或媒体播放器很容易改变。他们呼叫,你也可以。请注意,如果有任何问题,提高时钟中断率可能会对电池寿命产生重大影响。亲爱的汉斯,你的计算是正确的。我得到的是31毫秒&一段时间后是32毫秒,然后也是31毫秒。当我打开firefox时,对于500个读数,它会精确到20毫秒。要恢复此问题,请立即提问。。要我把时间开始定在什么时候吗?汉斯。。。你做到了。。非常感谢:)。它像魔法一样工作。我使用了timeBeginPeriod(10),一切正常。请建议如何将您的职位设置为回答者。那么,您建议使用什么?。我看到一个Java程序,它使用Thread.Sleep(20)&似乎工作得很好。这与编程语言或操作系统有关吗?&对于.net,对于我来说,在时间准确性和CPU利用率之间保持良好平衡的最佳解决方案是什么。谢谢。我希望Java应用程序也有同样的行为——至少在Windows上是这样。事实上,Java文档对超时也有相同的说明。我还有一个问题,当我使用winmme timeBegion时,它在x 32位系统中工作得很好。但在x64位系统上,它给出了奇怪的行为。请建议如何在64个系统上克服这个问题。我已经尝试了第一个选项和第二个选项,但似乎我做错了什么。秒表不能提供准确的数据。我发现时钟中断改变了一个样本解决方案。非常感谢您的大力支持。非常感谢。对不起,很可能1和2不能直接工作-我没有测试它们,应该补充说:)没有问题。亲爱的詹姆斯,非常感谢你的大力支持。非常感谢。