我正在编写交易软件,需要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/