加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 最精确的Thread睡眠方法:Monitor.Wait vs System.Timer v

发布时间:2020-12-16 00:03:44 所属栏目:百科 来源:网络整理
导读:什么.NET对象(或技术)在每XXX毫秒启动一个线程时最精确?有什么权衡? 例如: int maxDurationMs = 1000; while (true) { DateTime dt = DateTime.UtcNow; DoQuickStuff() TimeSpan duration1 = DateTime.UtcNow - dt; int sleepTime = maxDurationMs - dura
什么.NET对象(或技术)在每XXX毫秒启动一个线程时最精确?有什么权衡?

例如:

int maxDurationMs = 1000;
        while (true)
        {
            DateTime dt = DateTime.UtcNow;
            DoQuickStuff()
            TimeSpan duration1 =  DateTime.UtcNow - dt;
            int sleepTime = maxDurationMs - duration1.Milliseconds;
            if (sleepTime > 0)
                System.Threading.Thread.Sleep(sleepTime);
        }

要么

// CPU Intensive,but fairly accurate
       int maxDurationMs = 1000;
        while (true)
        {
            DateTime dt = DateTime.UtcNow;
            DoQuickStuff()
            while (true)
            {
                if (dt.AddMilliseconds(maxDurationMs) >= DateTime.UtcNow)
                    break;
            }
        }

做同样事情的替代方法,但具有不同程度的准确性和权衡(CPU等)

> System.Timer
> DispatchTimer
> System.Threading.Timer
> Thread.Join
> .NET 4.0 Task
> Thread.Sleep()
> Monitor.Wait(obj,timespan)
> Multimedia Timers(感谢Brian Gideon)
> Win32 High Resolution timers
>还有别的吗?

解决方法

我自己从未实际使用它们,但据说 Multimedia Timers具有Windows中任何计时器服务的最佳分辨率. .NET BCL没有此计时器服务的包装器,因此您必须自己进行P / Invoke调用.

另一种选择可能是在紧密循环中使用秒表和一些标准的Thread.Sleep调用.我不确定这种方法会带来多少运气,但它可能比普通的Thread.Sleep调用更准确.我从未尝试过,但我认为任何事都值得一试.

我做了一些实验,我发现将线程优先级更改为ThreadPriority.Highest有很大的不同.它在我尝试的每种技术上都相当减少了间隔的标准偏差.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读