Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用线程时出现问题。短时间睡眠_C#_.net_Multithreading_Thread Sleep - Fatal编程技术网

C# 使用线程时出现问题。短时间睡眠

C# 使用线程时出现问题。短时间睡眠,c#,.net,multithreading,thread-sleep,C#,.net,Multithreading,Thread Sleep,我有一个有两个线程的应用程序(现在),但函数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));

我有一个有两个线程的应用程序(现在),但函数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
}
intvlakien=2;
丝线[]弗拉克纳;
vlakna=新螺纹[vlakien];
对于(int i=0;i
此外,我还尝试在功能utok中使用秒表进行睡眠,这也需要更多的时间:

Stopwatch SW = new Stopwatch(); SW.Start();
while(SW.ElapsedMilliseconds < 5000) ;
Stopwatch SW=新秒表();SW.Start();
而(SW.ElapsedMilliseconds<5000);

请提供帮助。

在Microsoft C#中睡眠可以保证最短的时间。睡眠不足5毫秒肯定是个问题。此外,秒表的测量可能不是很精确,请尝试使用高精度介质计时器。

它受系统时钟分辨率的影响。它大约是15毫秒…您不能低于系统时钟的分辨率。看看链接(它是C++,但你会知道计时器分辨率)。

< P>参数传入线程。睡眠是睡眠的最小时间,不是精确的时间。 15ms是windows上的线程时间片(实际上,您可能会弄乱windows并更改它……不推荐这样做)。事情可以让他们的时间提前分配,但任何事情都可能占用他们的全部时间


所以很难得到比这更好的结果,事实上,20或30毫秒的可能性更大。我曾经做过实时处理,它有一个50毫秒的硬实时限制。如果您遵守某些规则(在C++中),这在windows上运行良好。

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

但是,您可以通过发出

timeBeginPeriod(1);
timeEndPeriod(1);
在哪里


我们在串行通信服务中做到了这一点,在这种服务中,及时准确地间隔发送非常重要。有些人不愿意这样做,因为这会导致Windows更频繁地执行其他基于计时器的操作。实际上,这并没有给我们带来明显的问题,我们有数百个安装,每个安装都连接了数百个串行设备。

是的,
线程。睡眠
不能保证在指定的时间内完全睡眠。通常使用它是应用程序设计拙劣的标志。不清楚你想用它来解决什么问题。考虑更新你的问题,讨论真正的问题,而不是你失败的解决方案。我用SARPPCAP和PACKETDOTNET发送大量的数据包(DoS攻击模拟[文凭工作]),我想用包之间的小延迟来模拟它(没有延迟/5ms延迟/10ms延迟……).在专用机器上不会有问题,但我几乎不推荐通用。如果你的安装人员对我的机器做过那样的事,我可能会去邮局。更重要的是,这仍然不能确保计时器实际使用1毫秒的分辨率。Windows仍然不是一个实时操作系统。它们是专用机器。当然,您是正确的,这并没有改变Windows不是实时操作系统的事实。看起来您也应该调用
timeEndPeriod
-“您必须将对
timeBeginPeriod
的每个调用与对
timeEndPeriod
的调用相匹配,在两个调用中指定相同的最小分辨率。”我不同意秒表会像媒体计时器一样提供高精度计时。据我所知,媒体计时器使用的是同一个计时器,即QueryPerformanceCounter。我知道标准windows PC上没有其他高分辨率计时器。MSDN中是否有任何文章对此提供证明?这是针对任务的。延迟,但线程可能也是如此。睡眠。。。
[DllImport(WINMM)]
internal static extern uint timeBeginPeriod(uint period);