C# Thread.Sleep 不精准的问题以及解决方案

C# Thread.Sleep 不精准的问题以及解决方案

1.问题

最近在写一个熔断的 SDK,其中一种策略是根据慢请求来进行熔断。

我们在测试的时候,在对应 API 里面采用了 Thread.Sleep(ms) 来模拟慢请求。

设置的慢请求阈值是 RT 100ms,我们设置了 Thread.Sleep(90ms),但是发现竟然触发了熔断。最近分析发现是 Thread.Sleep 并不精准,在测试机器(Windows 10)上偏差最大超过了 10ms,在我自己的电脑上(Mac)偏差最大 5ms。

为什么会这样呢?“因为Thread.Sleep保证的是至少休眠指定的值”(来自时总的解答 https://www.cnblogs.com/InCerry)

这不是 C# 的问题,JAVA 也一样。

编写了 JAVA 代码,发现结果在我的机器上和 C# 是一样的,最大偏差 5ms。

这个偏差和机器CPU、负载、Sleep 时间、操作系统有关。

2.解决

如何解决这个问题?我尝试降低 Sleep 时间,通过循环计时,发现这个方法的精准度挺高的。

static void Sleep(int ms)

{

var sw = Stopwatch.StartNew();

var sleepMs = ms - 16;

if (sleepMs > 0)

{

Thread.Sleep(sleepMs);

}

while (sw.ElapsedMilliseconds < ms)

{

Thread.Sleep(0);

}

}

经过了时总的优化

上面的代码运行测试:

相关推荐

健康影响评估及其在决策中的作用
365bet在线手机版

健康影响评估及其在决策中的作用

📅 07-31 👁️ 192
削骨后遗症?杨幂近照V脸变国字脸,网友吐槽重回“嫩牛五方”
佣金宝转户的流程 佣金宝如何转户? 无法转户怎么处理?
优玩是什么?优玩怎么样?[多图]
365bet在线手机版

优玩是什么?优玩怎么样?[多图]

📅 07-19 👁️ 8551
2025必用!这5款招聘软件竟能免费发岗位?
亚洲365世界杯

2025必用!这5款招聘软件竟能免费发岗位?

📅 10-07 👁️ 8870
从郑州到吉林多少公里、要多长时间、自驾最佳路线、油费、过路费-开车从郑州到吉林路线(返程)
图解12306退票流程与步骤
365bet在线手机版

图解12306退票流程与步骤

📅 09-21 👁️ 2522
《黑潮之上》角色卡牌介绍 角色卡牌是什么
beat365老版本

《黑潮之上》角色卡牌介绍 角色卡牌是什么

📅 09-21 👁️ 9693
11 种富含铁质的水果提高你的铁含量
365bet在线手机版

11 种富含铁质的水果提高你的铁含量

📅 09-25 👁️ 6632