使用Thread.Sleep短时间的问题

我有一个2线程(现在)的应用程序,但似乎函数Thread.Sleep()不能很好地工作。 它会占用线程,但需要花费更的时间(例如 – 我想睡5分钟,睡眠时间为0.3秒或更长)。 这是代码:

int vlakien = 2; Thread[] vlakna; vlakna = new Thread[vlakien]; for (int i = 0; i < vlakien; i++) { try { vlakna[i] = new Thread(new ThreadStart(utok)); vlakna[i].Start(); } } private void utok() { //some code Thread.Sleep(5); //some code } 

此外,我试图在functionutok中使用秒表睡觉它也需要更多时间:

 Stopwatch SW = new Stopwatch(); SW.Start(); while(SW.ElapsedMilliseconds < 5000) ; 

请帮忙。

15ms是Windows上的线程时间片(你实际上可以搞乱窗口并改变它……根本不推荐)。 事情可以让他们的时间提早,但任何事情都可能花费他们的全部时间。

所以真的很难比这更好,事实上,实际上20或30毫秒更有可能。 我曾经做过实时处理,实时限制为50ms。 如果你遵守某些规则(在C ++中),这在Windows上运行良好

正如其他人所指出的,睡眠的默认分辨率是10或15毫秒,具体取决于Windows的版本。

但是,您可以通过发出一个来重新编程定时器以使用1毫秒的分辨率

 timeBeginPeriod(1); timeEndPeriod(1); 

哪里

 [DllImport(WINMM)] internal static extern uint timeBeginPeriod(uint period); 

我们在串行通信服务中执行此操作,其中能够准确地及时隔离发送是很重要的。 有些人不愿意这样做,因为它会导致Windows更频繁地执行基于计时器的其他事情。 实际上,这对我们没有造成任何明显的问题,我们有数百个安装,每个安装都连​​接了数百个串行设备。

在Microsoft C#中睡眠可以保证最短的时间。 它睡眠不到5毫秒肯定是个问题。 秒表也可能不是非常精确的测量,尝试高精度的媒体计时器。

它受系统时钟分辨率的影响。 它大概是15ms ……你不能低于系统时钟的分辨率。 看看这个链接(它是C ++,但你会了解定时器分辨率)。

传递给Thread.Sleep的参数是睡眠的最短时间,而不是确切的时间。