计时器落后了

时间:2011-12-30 15:20:06

标签: c# windows-phone-7 timer

我希望在我的应用中有一个正在运行的计时器,它显示经过最多2个小数位的秒数,例如2.31秒。我正在使用System.Threading.Timer并且我将Timer对象设置为每10毫秒调用refreshTimeBox()函数(因为我希望秒数最多为2位小数)。但是,计时器落后了。随着时间的推移,它越来越落后。我猜它是因为refreshTimeBox()花了太长时间才完成。但是,我也尝试每隔100毫秒调用refreshTimeBox()。计时器仍然滞后。唯一的区别是在这种情况下较长时间之后滞后比在我使用10毫秒作为间隔的情况下变得明显。我有以下代码来初始化计时器:

timer = new Timer(refreshTimeBox, null, 0, 10);

以下是refreshTimeBox的代码:

public void refreshTimeBox(object param)
{
    time += 0.01f;
    Dispatcher.BeginInvoke(WriteTimeBox);
}

以下是WriteTimeBox的代码:

public void WriteTimeBox()
{
    TimeBar.Text = time.ToString("0.00");
}

time是存储已用时间的变量,TimeBar是正在更新的文本框。

我想要尽可能准确的计时器。请帮我解决一下这个。感谢。

3 个答案:

答案 0 :(得分:3)

如果您想显示自过去的特定事件以来经过的时间量,那么最好的方法是将时间存储在“零时间”,例如startTime,然后,在您的计时器事件中,通过从当前时间减去startTime并显示差异来计算已经过的时间。

您不能依赖精确间隔的定时事件。这不是一个实时系统。添加到其中,您应该知道BeginInvoke可能请求方法调用发生在与当前方法不同的线程上,并且该不同的线程可能无法在当前时间调度该方法调用。 / p>

答案 1 :(得分:3)

你也可以使用秒表

        System.Diagnostics.Stopwatch sw=new System.Diagnostics.Stopwatch();
        sw.Start();

在更新功能

        TimeBar.Text = sw.ElapsedMilliseconds;

然后您不必担心UTC问题

答案 2 :(得分:1)

定时器总是有滞后的可能性。您需要做的是在开始时存储,然后将其与当前时间进行比较。

private DateTime startTime;
public void startTimer() {
    startTime = DateTime.Now;
}

public void refreshTimeBox(object param)
{
    Dispatcher.BeginInvoke(WriteTimeBox);
}

public void WriteTimeBox()
{
    TimeSpan ts = DateTime.Now - startTime;
    // See http://msdn.microsoft.com/en-us/library/1ecy8h51.aspx for TimeSpan formatting.
    TimeBar.Text = ts.time.ToString("s.ff");
}