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

科技资讯 投稿 56700 0 评论

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

1.问题

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

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

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

至少休眠指定的值”(来自时总的解答 https://www.cnblogs.com/InCerry)

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

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

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

2.解决

如何解决这个问题?我尝试降低 Sleep 时间,通过循环计时,发现这个方法的精准度挺高的,不过也仅限用于测试场景。

var sw = new Stopwatch(;
var ct = TimeUtil.CurrentTimeMillis(;
sw.Start(;
while (sw.ElapsedMilliseconds < 90
{
   Thread.Sleep(0;
}
sw.Stop(;

上面的代码运行测试:

编程笔记 » C# Thread.Sleep 不精准的问题以及解决方案

赞同 (45) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽