使用Thread.Sleep短时间的问题

mat*_*148 5 .net c# 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
}
Run Code Online (Sandbox Code Playgroud)

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

Stopwatch SW = new Stopwatch(); SW.Start();
while(SW.ElapsedMilliseconds < 5000) ;
Run Code Online (Sandbox Code Playgroud)

请帮忙.

Kei*_*las 9

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

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


500*_*ror 5

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

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

timeBeginPeriod(1);
timeEndPeriod(1);
Run Code Online (Sandbox Code Playgroud)

哪里

[DllImport(WINMM)]
internal static extern uint timeBeginPeriod(uint period);   
Run Code Online (Sandbox Code Playgroud)

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