我想要写一个程序,需要得到一个滴答事件每秒钟。程序运行了许多小时,滴答必须与系统时钟的秒数一致。使用任何一种计时器,每秒钟触发一个事件是不好的主意。有很多不准确的地方。如果你有一个不准确的100毫秒每秒,计时器是6减去后面的系统时钟每小时。但是,它必须准确地符合系统时钟。
从系统时钟获取事件是可以的。
不准确在一秒钟内是可以的,但并不是全部。
你有什么建议来解决这个问题?
该解决方案必须在c# net6上运行(我计划在Windows上运行该程序)。
谢谢
发布于 2022-01-06 15:01:48
这会让你在时钟的每一秒之后到达0..20毫秒以内。
static System.Threading.Timer timer = new(CallBack, null, 0, 0);
static void CallBack(object? state)
{
var now = DateTime.Now;
timer.Change(1000 - now.Millisecond, 0);
// Console.WriteLine(now + " " + now.Millisecond);
}发布于 2022-01-06 14:57:32
如果准确性是一个问题,而且您不喜欢引发事件的计时器的准确性,那么一个简单的解决方法就是使用轮询方法。
我并不是说这是有效的,您可能希望确保您为每个滴答执行的任务在比您想要启动的单元更短的时间内完成,因此在本例中是一秒钟,但它满足了紧密绑定到系统时钟的要求:
Action tickAction = () => Console.WriteLine(DateTime.Now);
int lastTick = DateTime.Now.TimeOfDay.Seconds;
while (true)
{
var seconds = DateTime.Now.TimeOfDay.Seconds;
if(lastTick != seconds)
{
lastTick = seconds;
tickAction();
}
}您也可以在每次动作启动一个计时器后,延迟等于下一秒剩下的滴答数,但这是因为1秒计时器有点过分。但是,如果时间间隔是可变的,或者执行操作所需的时间可能超过下一个窗口,那么以基于计时器的方式这样做就足够了。
--总的来说,事件处理循环以及后台发生的任何事情都会影响到该解决方案的准确性,在每秒钟执行更多的操作时,拥有更多的上下文将有助于产生更具有商业可行性的解决方案。
https://stackoverflow.com/questions/70608711
复制相似问题