首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c#每秒钟一次

c#每秒钟一次
EN

Stack Overflow用户
提问于 2022-01-06 14:31:29
回答 2查看 551关注 0票数 0

我想要写一个程序,需要得到一个滴答事件每秒钟。程序运行了许多小时,滴答必须与系统时钟的秒数一致。使用任何一种计时器,每秒钟触发一个事件是不好的主意。有很多不准确的地方。如果你有一个不准确的100毫秒每秒,计时器是6减去后面的系统时钟每小时。但是,它必须准确地符合系统时钟。

从系统时钟获取事件是可以的。

不准确在一秒钟内是可以的,但并不是全部。

你有什么建议来解决这个问题?

该解决方案必须在c# net6上运行(我计划在Windows上运行该程序)。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-06 15:01:48

这会让你在时钟的每一秒之后到达0..20毫秒以内。

代码语言:javascript
复制
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);
}
票数 1
EN

Stack Overflow用户

发布于 2022-01-06 14:57:32

如果准确性是一个问题,而且您不喜欢引发事件的计时器的准确性,那么一个简单的解决方法就是使用轮询方法。

我并不是说这是有效的,您可能希望确保您为每个滴答执行的任务在比您想要启动的单元更短的时间内完成,因此在本例中是一秒钟,但它满足了紧密绑定到系统时钟的要求:

代码语言:javascript
复制
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秒计时器有点过分。但是,如果时间间隔是可变的,或者执行操作所需的时间可能超过下一个窗口,那么以基于计时器的方式这样做就足够了。

--总的来说,事件处理循环以及后台发生的任何事情都会影响到该解决方案的准确性,在每秒钟执行更多的操作时,拥有更多的上下文将有助于产生更具有商业可行性的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70608711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档