我有一个带有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) ;
请帮忙。
答案 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的参数是睡眠的最短时间,而不是确切的时间。