2012-06-10 59 views
0

所以,我有一个应用程序(在C#上的Windows Phone 7.5)使用DispatcherTimer来模拟计时器。我已经将间隔设置为1毫秒:窗口电话DispatcherTimer精度

TimeSpan countdown = TimeSpan.FromSeconds(10); 

在每个刻度IM从其减去1 millisencond:

countdown = countdown.Subtract(TimeSpan.FromMilliseconds(1)); 

timer.Interval = new TimeSpan(0,0,0,0,1); 

然后我为了做一个简单的倒计时正在申报时间跨度

在Visual Studio的Windows手机模拟器256/512其工作与'没有问题',但是当我在我的手机(LG Quantum)上运行它似乎有精度问题。我将它与运行该应用程序的PC屏幕进行了比较,并将其与手机上的方式进行了比较。我试图不在我的手机中以调试模式运行应用程序。有没有解决这个问题的方法?或者我必须采取另一种方法?

+0

你究竟想要完成什么?定时器总是很棘手,间隔很小。 –

+0

我需要以毫秒精度显示倒计时(秒:毫秒)。 –

+2

似乎发射一个事件需要超过一毫秒。因此,你最好的选择是[假装有毫秒精度](http://stackoverflow.com/a/10972639/458193)。 –

回答

3

经验告诉我,你只是试图为手机硬件处理太多的事件。

从MSDN:

的DispatcherTimer在每个DispatcherTimer循环的顶部重新评估。

定时器不保证在发生时间间隔时精确执行,但它们保证在时间间隔发生之前不会执行。

请记住,实际的电话硬件是单核,所以试图每秒精确捕获1000个事件并不是最好的方法。

要么根据新的时间间隔增加滴答时间和增量之间的时间,要么花费计时器启动的时间,并从每个滴答的当前时间中减去它。

+0

优秀的解释,我们也必须认为windows phone可能不会像android手机一样运行许多应用程序在后台,但仍然需要运行基本的电话任务。谢谢。 –

6

一种不同的方法会更好这里:

  1. 记录当前时间,当你启动定时器

    DateTime startTime = DateTime.Now; 
    
  2. 每次你的计时器滴答,重新计算的倒计时

    TimeSpan countdown = DateTime.Now - startTime; 
    
+0

好吧,我用你的方法(及其解决方案)获得了更高的精度,但是你能解释为什么减去DateTime的对象比从TimeSpan中减去更好吗? –

+0

因为我的解决方案不依赖于DispatchTimer的周期 – Eric

+0

解决方案的其余部分是随后重新调整DispatcherTimer的延迟,所以如果一个任务附加到tick的触发上,它会或多或少地执行在准确的时间。 –