为了账号安全,请及时绑定邮箱和手机立即绑定

Thread.Sleep少于1毫秒

Thread.Sleep少于1毫秒

慕村225694 2019-11-02 13:55:52
我想在不到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); }我很高兴得到您的意见。
查看完整描述

3 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

你做不到 单个睡眠呼叫通常会阻塞Thread.Sleep(1)一秒以上(它取决于操作系统和系统,但以我的经验,通常会阻塞12到15毫秒之间)。


通常,Windows并非设计为实时操作系统。在Windows的普通(台式机/服务器)版本上通常无法实现这种控制。


通常可以得到的最接近的结果是旋转并消耗CPU周期,直到达到所需的等待时间(以高性能计数器衡量)。但是,这非常糟糕-您会吃光整个CPU,即使那样,您有时还是会被操作系统抢占,并有效地“睡眠”超过1毫秒...


查看完整回答
反对 回复 2019-11-02
?
POPMUISE

TA贡献1765条经验 获得超5个赞

下面的代码绝对可以提供一种更精确的阻塞方法,而不是调用Thread.Sleep(x);方法(尽管此方法将阻塞线程,而不是使其进入睡眠状态)。下面,我们使用StopWatch该类来衡量我们需要保持循环并阻塞调用线程多长时间。


using System.Diagnostics;


private static void NOP(double durationSeconds)

{

    var durationTicks = Math.Round(durationSeconds * Stopwatch.Frequency);

    var sw = Stopwatch.StartNew();


    while (sw.ElapsedTicks < durationTicks)

    {


    }

}

用法示例,


private static void Main()

{

    NOP(5); // Wait 5 seconds.


    Console.WriteLine("Hello World!");


    Console.ReadLine();

}


查看完整回答
反对 回复 2019-11-02
  • 3 回答
  • 0 关注
  • 1072 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信