我正在编写交易软件,需要QoS的一种方法,该方法每秒执行的次数不应超过10次。因为我是C#的入门者,几乎不熟悉库,所以我想仔细检查一下我的代码是否“最优”。我正在使用Stopwatch,因为我不知道C#中的任何其他计时器。

    Stopwatch updateStopwatch = Stopwatch.StartNew();

    private void update()
    {
        if (updateStopwatch.ElapsedMilliseconds < 100)
        {
            Console.WriteLine("!skip update " + updateStopwatch.ElapsedMilliseconds);
            return;
        } else
        {
            Console.WriteLine("!update");
            updateStopwatch.Restart();;
        }
        // do work here
    }


upd现在看来秒表可以很好地完成这项任务。但是可能会太慢,如果可能的话,DateTime会更好。也出售Stopwatch vs. using System.DateTime.Now for timing events

最佳答案

您使用Stopwatch的技术是防止代码更频繁执行的最佳解决方案。正如其他人所说,如果要确保按计划执行该方法,则使用Timer是更好的解决方案。

从根本上打破了任何基于DateTime的方法,因为它会在日期更改时失败。在“夏令时”切换期间,这一点尤其明显。当我们“大步向前”时,有可能快速连续运行两次更新,因为代码认为距上一次更新已经一个小时了。还算不错但是,当我们“后退”时,更新将被暂停一整小时,因为上一次更新时间被提前了一个小时。

如果您的计算机设置为从NTP服务器定期更新其时间,则可能会发生同样的事情,尽管程度不那么严重。如果时间提前,则有可能连续两次进行更新。如果时间被调回,则有可能在时钟被调回的时间内不进行更新。

有很多方法可以解决该问题(例如,使用毫秒数的绝对值),但是您只是将绷带绑在一个破损的解决方案上。您不应该在这样的间隔内依赖DateTime,因为您的程序不受系统时钟的控制-它可以随时更改。

Stopwatch是这里唯一合理的解决方案,因为它取决于CPU的性能计数器,该计数器只会增加。您不会遇到有人将计数器调回的问题,也不会遇到诸如Environment.TickCount之类的翻转问题。

有人认为Stopwatch会导致DateTime不会造成的性能损失。我的测试表明这是不正确的。

关于c# - 如何每100ms不执行一次某些类方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5678281/

10-15 04:49
查看更多