C#计时器与Datetime.Now同步

时间:2010-06-08 09:47:29

标签: c#

在C#中如何创建一个与系统DateTime同步的计时器。每当DateTime.Now

的秒数发生变化时,自定义计时器都应该打勾

4 个答案:

答案 0 :(得分:4)

如果您在SO上查看以前的一些问题,您将很难获得计时器的准确性。以下是以前问题的一小部分示例:

以下是another previous question,可能会为您提供一些帮助。

答案 1 :(得分:0)

你想要的精度是多少?

如果你说1ms足够精确(或10或100),你总是可以做一个比较当前时间和上一次迭代保存的循环的循环,并在当前时间的秒值时启动一个线程价值变化......

答案 2 :(得分:0)

您可以使用一些计划库,例如Quartz.net,它提供了示例并且易于使用: http://quartznet.sourceforge.net/

答案 3 :(得分:0)

此代码使用System.Threading.Timer。它将查看触发器被调用的毫秒偏移量。如果误差超出可接受的范围,它将重新调整计时器,并通过平均每个刻度的误差来纠正间隔。

class Program {
    const int MAX_ERROR_IN_MILLISECONDS = 20;
    const int ONE_SECOND = 1000;
    const int HALF_SECOND = ONE_SECOND / 2;

    private static System.Threading.Timer timer;

    static void Main(string[] args) {

        timer = new System.Threading.Timer(Tick);

        timer.Change(ONE_SECOND - DateTime.Now.Millisecond, ONE_SECOND);
        Console.ReadLine();
    }

    private static int ticksSynced = 0;
    private static int currInterval = ONE_SECOND;
    private static void Tick(object s) {
        var ms = DateTime.UtcNow.Millisecond;
        var diff = ms > HALF_SECOND ? ms - ONE_SECOND : ms;
        if (Math.Abs(diff) < MAX_ERROR_IN_MILLISECONDS) {
            // still synced
            ticksSynced++;
        } else {
            // Calculate new interval
            currInterval -= diff / ticksSynced;
            timer.Change(ONE_SECOND - ms, currInterval);
            Console.WriteLine("New interval: {0}; diff: {1}; ticks: {2}", currInterval, diff, ticksSynced);
            ticksSynced = 0;
        }
        Console.WriteLine(ms);
    }
}

正如您所看到的,您无法完全触发Windows中的第二次更改。你可以试着靠近。