【问题标题】:windows phone DispatcherTimer precisionwindows phone DispatcherTimer 精度
【发布时间】:2012-06-10 21:49:57
【问题描述】:

所以,我得到了一个使用 DispatcherTimer 来模拟计时器的应用程序(Windows phone 7.5 over c#)。我已将间隔设置为 1 毫秒:

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

然后我声明一个 TimeSpan 以便进行简单的倒计时:

TimeSpan countdown = TimeSpan.FromSeconds(10);

在每个刻度上,我减去 1 毫秒:

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

在 Visual Studio 的 windows phone 模拟器 256/512 中,它的工作“没有问题”,但是当我在我的手机 (LG Quantum) 上运行它时,它似乎有精度问题。我已经将它与运行应用程序的 PC 屏幕进行了比较,它在手机上的运行速度较慢。我试图不在我的手机中以调试模式运行应用程序。有什么解决办法吗?还是我必须采取另一种方法?

【问题讨论】:

  • 您到底想完成什么?计时器总是很棘手,间隔时间很短。
  • 我需要以毫秒精度显示倒计时(秒:毫秒)。
  • 触发一个事件似乎需要超过一毫秒。因此,您最好的选择是pretend to have milliseconds precision

标签: c# windows-phone-7


【解决方案1】:

这里采用不同的方法会更好:

  1. 启动计时器时记录当前时间

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

    TimeSpan countdown = DateTime.Now - startTime;
    

【讨论】:

  • 好的,我的方法(及其解决方案)更加精确,但您能解释一下为什么减去 DateTime 的对象比减去 TimeSpan 更好吗?
  • 因为我的解决方案不依赖于 DispatchTimer 的周期
  • 解决方案的其余部分将相应地重新调整DispatcherTimer延迟,因此如果任务附加到触发滴答,它或多或少会在准确的时间执行。跨度>
  • 你能帮我解决这个问题吗stackoverflow.com/questions/22632006/…
【解决方案2】:

经验告诉我,您只是试图触发太多事件,手机硬件无法处理。

来自 MSDN:

DispatcherTimer 在每个 DispatcherTimer 循环的顶部重新计算。

不保证定时器在时间间隔发生时准确执行,但保证在时间间隔发生之前不执行。

请记住,实际的手机硬件是单核的,因此尝试每秒精确捕获 1000 个事件并不是最好的方法。

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

【讨论】:

  • 很好的解释,我们也不得不认为windows phone 可能没有android 手机在后台运行那么多的应用程序,但仍然必须运行基本的手机任务。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
相关资源
最近更新 更多