时钟应用

时间:2010-06-08 08:35:03

标签: c# silverlight

我正在用C#.Net创建一个时钟应用程序。我有0-9的每个数字的图像。我在主页面构造函数中有一个计时器,每秒都会打勾

DispatcherTimer tmr = new DispatcherTimer();
tmr.Interval = TimeSpan.FromSeconds(1);
tmr.Tick += new EventHandler(tmr_Tick);
tmr.Start();

void tmr_Tick(object sender, EventArgs e)
    {
        dt = DateTime.Now;
        UpdateSecondsImages(dt);
    }


private void UpdateSecondsImages(DateTime dt)
    {
        secondSource2 = dt.Second % 10;
        secondDigit2.Source = digimgs[secondSource2];
        if (secondSource2 == 0)
        {
            secondSource1 = dt.Second / 10;
            secondDigit1.Source = digimgs[secondSource1];
        }

        if (secondSource1 == 0)
        {
            UpdateMinuteImages(dt);
        }
    }

但我现在面临的问题是这段代码可能会跳过一秒钟。请从性能的角度建议另一种方法使其顺利进行。

3 个答案:

答案 0 :(得分:3)

简单。当你设置一个计时器每秒钟你都说,“请先醒来至少 1秒,然后再醒来并通知我”。实际上,你可能会睡得更久。此外,不同的定时API相对于彼此具有时钟漂移。定时器所基于的时钟可能与DateTime.Now所基于的时钟不同。

可以这样想吧 - 假设你实际上每隔1.02秒就会醒来一次。 因此,每50秒,你将在渲染中跳过一个节拍。例如,你将从“49.98”(呈现为“49”)醒来,然后你的下一个间隔你将被唤醒“51.00”。

简单的解决方法是睡眠时间不到1秒。在你的情况下,我建议睡觉在500-750毫秒而不是一整秒。在同一秒间隔内唤醒的情况下,您可以简单地重新渲染同一时间。或者作为一个微不足道的优化,只要你已经醒来,第二次计数自上次以来没有改变就什么都不做。

试着说:    tmr.Interval = TimeSpan.FromMilliSeconds(500);

答案 1 :(得分:1)

如果可以仅在可见时显示时钟,我宁愿建议使用CompositionTarget.Render事件处理程序。获取当前时间并适当更新UI。这不仅可以消除错误,还可以让你渲染毫秒:)。

我非常怀疑这种方法会影响性能(cos()和sin()在我们的日子里很快)。但即使它(你正在渲染数千个时钟),你也可以不在每一帧上更新UI。

希望这有帮助。

答案 2 :(得分:0)

昨天我们与Ball Watch USA合作,在Silverlight上制作手表。我建议使用Storyboard在1分钟内将秒针旋转360度并将故事板设置为永久重复。以下是一些链接: