猿问

Thread.Sleep少于1毫秒

我想在不到1毫秒的时间内调用线程睡眠。我没有读过那个线程,睡眠和Windows-OS都不支持。


有什么解决方案?


对于所有想知道为什么我需要这样做的人:我正在进行压力测试,并且想知道我的模块每秒可以处理多少条消息。所以我的代码是:


 // Set the relative part of Second hat will be allocated for each message 

 //For example: 5 messages - every message will get 200 miliseconds 

 var quantum = 1000 / numOfMessages;


 for (var i = 0; i < numOfMessages; i++)

 {

      _bus.Publish(new MyMessage());

      if (rate != 0) 

          Thread.Sleep(quantum);

 }

我很高兴得到您的意见。


慕村225694
浏览 1073回答 3
3回答

MMMHUHU

你做不到 单个睡眠呼叫通常会阻塞Thread.Sleep(1)一秒以上(它取决于操作系统和系统,但以我的经验,通常会阻塞12到15毫秒之间)。通常,Windows并非设计为实时操作系统。在Windows的普通(台式机/服务器)版本上通常无法实现这种控制。通常可以得到的最接近的结果是旋转并消耗CPU周期,直到达到所需的等待时间(以高性能计数器衡量)。但是,这非常糟糕-您会吃光整个CPU,即使那样,您有时还是会被操作系统抢占,并有效地“睡眠”超过1毫秒...

POPMUISE

下面的代码绝对可以提供一种更精确的阻塞方法,而不是调用Thread.Sleep(x);方法(尽管此方法将阻塞线程,而不是使其进入睡眠状态)。下面,我们使用StopWatch该类来衡量我们需要保持循环并阻塞调用线程多长时间。using System.Diagnostics;private static void NOP(double durationSeconds){&nbsp; &nbsp; var durationTicks = Math.Round(durationSeconds * Stopwatch.Frequency);&nbsp; &nbsp; var sw = Stopwatch.StartNew();&nbsp; &nbsp; while (sw.ElapsedTicks < durationTicks)&nbsp; &nbsp; {&nbsp; &nbsp; }}用法示例,private static void Main(){&nbsp; &nbsp; NOP(5); // Wait 5 seconds.&nbsp; &nbsp; Console.WriteLine("Hello World!");&nbsp; &nbsp; Console.ReadLine();}
随时随地看视频慕课网APP
我要回答