使用Thread.Sleep短时间的问题

时间:2012-01-13 01:23:43

标签: c# .net multithreading 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
}

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

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

请帮忙。

5 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:5)

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

但是,您可以通过发出

重新编程定时器以使用1毫秒的分辨率
timeBeginPeriod(1);
timeEndPeriod(1);

,其中

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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