首页 > 编程语言 >C# Thread.Sleep问题

C# Thread.Sleep问题

时间:2022-08-23 09:13:13浏览次数:88  
标签:Thread C# sleepMs 熔断 Sleep ms

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);
    }
}

 

经过了时总的优化

 

上面的代码运行测试:

 

 

标签:Thread,C#,sleepMs,熔断,Sleep,ms
From: https://www.cnblogs.com/Leo_wl/p/16614922.html

相关文章

  • TCP 协议
    TCP协议有哪些缺陷?TCP协议有哪些缺陷?   作者:小林coding图解计算机基础网站:https://xiaolincoding.com大家好,我是小林。忽然思考一个问题,TCP通过序列号、......
  • centos8 安装docker、docker-compose、kvm
    目录安装docker-ce安装docker-compose安装kvm安装docker-cecd/etc/yum.repos.d/rm-rf./*yumremovepodman-manpages.noarch-ywget-O/etc/yum.repos.d/CentOS-B......
  • Jenkins+Docker 一键自动化部署 SpringBoot 项目
    实现最简单全面的Jenkins+docker+springboot 一键自动部署项目,步骤齐全,少走坑路。环境:centos7+git(gitee)简述实现步骤:在docker安装jenkins,配置jenkins基本信息,利用Do......
  • 【转】解决IDEA启动项目 Commandline is too long 问题
    解决IDEA启动项目Commandlineistoolong问题下载新项目并IDEA运行时,爆出如下错误Commandlineistoolong解决办法如下:找到.idea下workspace.xml文件Properties......
  • CentOS7使用firewalld打开关闭防火墙与端口
    1、firewalld的基本使用    启动:systemctlstartfirewalld    关闭:systemctlstopfirewalld    查看状态:systemctlstatusfirewalld     开机......
  • ARC099F题解
    被杀了,记录一下好了。对于他那个数组是否相等,直接判断复杂度很高,考虑通过哈希映射之后判断是否相等。对数组的Hash可以类似字符串Hash那样去做。于是判断一个区间是......
  • [css]用于记录开发环境中各个DB的html,使用css以美化
    【说明】用文本文件记开发环境中各个DB,只能搞一列,还不漂亮。用图片做又难以修改,wordexcel等又需要特定软件,用html/CSS正好解决了多列、美观、无特定软件依赖等需求。【......
  • RCD钳位电路工作原理
     反激式开关电源的RCD钳位电路由钳位电阻R1、钳位电容C1和钳位二极管D1组成,如图所示,其中电容Cds为开关管漏源极间寄生电容。在开关管工作期间,RCD钳位电路的工......
  • oracle java 安装
    1.8版本之后只需要添加以下:1.配置JDK环境目录:变量名:JAVA_HOME  值:D:\java\jdk182.添加一个PATH变量变量名: PATH   值:%JAVA_HOME%\bin1.8版本之前除以上外,需......
  • C# 浏览器 Chromium 内核控件
    miniblink 精简小巧的Chromium内核控件miniblink是一款精简小巧的浏览器控件,基于chromium精简而成,是市面上最小巧的chromium内核控件没有之一。它仅10余M大......