c# - 确保线程恰好在一秒钟内滴答作响的最佳方法是什么?

标签 c# multithreading

考虑到这是我的代码:

    public void alarmClockTick()
    {
        while(true){

            foreach(Alarm alarm in objectCollection){

                //Do some actions

            }

            Thread.Sleep(1000);
        }
    }

如果我们假设 for 循环执行某些可能需要几毫秒的操作,我如何确保线程循环恰好在 1 秒后循环?我目前正在开发一个闹钟,我希望我的这部分代码具有精确性。

我想过测量循环所需的时间,然后计算我们需要等待的时间,但是,时间测量也需要一些时间?

我将如何解决这个问题?

最佳答案

问题是 Windows 不是实时的。如果你使用计时器,你会在一秒钟后收到信号,但可能会有一些延迟。

处理它的最好方法是接受它并补偿它。那是: 存储时钟的开始时间。设置一个计时器一秒钟。每一秒之后设置一个新的计时器,但不是再次设置它,而是计算你在前一秒丢失的毫秒数,并将计时器设置为更正的值。继续使用此计算的原始开始时间,不要更新它,因为这样做可能会引入另一个偏差。只需根据原始开始时间计算修正即可。

如果有一个非常繁重的进程正在运行,您甚至可能需要不时地停下来。

关于c# - 确保线程恰好在一秒钟内滴答作响的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32013509/

相关文章:

c# - 从连接字符串中获取用户名和密码的正确方法?

c# - Serilog `rollOnFileSizeLimit` 不适用于配置文件

c# - .NET ICollection 类基础知识

c# - 当前的 VS 工具可以让每个开发人员以不同的方式查看 C# 代码

ios - 如何在合并更改时打破 Core Data 多线程保留周期?

c - 线程不并行运行

C# 定时器和网络调用并行

c# - Microsoft 的 .NET GWT 解决方案是什么?

ruby - MRI ruby​​ 线程和性能

java - 如何从 JFrame 中删除 JPanel?