Silverlight如何在特定时间安排事件?

6

我正在寻找一种触发Silverlight事件在特定时间发生的方法。该应用程序将在浏览器之外运行并一直运行。我已经找到一些使用计时器每分钟触发事件,然后检查是否是执行某些操作的正确时间的方法,但这听起来很混乱。是否有一种在2010年9月23日上午10:34触发事件的方法呢?

4个回答

2
如果您希望定时器能在应用程序重新启动后继续运行,我建议使用轮询并在某个地方保留预定任务。
否则,只需将计时器间隔设置为当前时间和预定时间之间的时间间隔。

0

我不相信Silverlight中有这样的功能。如果您不喜欢轮询方法,您可以始终获取DateTime.Now和目标时间之间的差异,并设置一个计时器来等待那么长时间。虽然我不知道这是否可靠。


一个 Timer 就是完成这项工作的工具,我没有看到它比其他方法不可靠的任何理由。如果能提供一个简单的代码示例,那么这个答案将会更加完善。 - AnthonyWJones
计时器适用于短时间间隔,所以我不确定这是否准确。请查看我的帖子。 - Peet Brits

0

我不知道有任何控件可以做到你所要求的功能。以下是我熟悉的计时器:

  • System.Threading.Timer(interval) - 生成重复事件(纯数字计时,没有UI更新)
  • System.Windows.Threading.DispatcherTimer(..) - 在线程上下文中使用(WPF/Silverlight)
  • System.Windows.Forms.Timer() - 使用Windows窗体消息循环(WinForms在主UI线程中)

我认为你最好使用一个间隔为30秒的DispatcherTimer,然后将实际时间与预期时间和日期匹配。据我所记,这样的计时器适用于小间隔,因此大间隔会不太准确。(我可能错了)

编辑MSDN有关计时的说明:“定时器不能保证在时间间隔发生时恰好执行,但它们保证不会在时间间隔之前执行。这是因为 DispatcherTimer操作像其他操作一样放置在 Dispatcher队列中。当DispatcherTimer操作执行取决于队列中的其他作业及其优先级。”


你提到了长时间间隔的精确度。那么最好的情况肯定是先等待一个长时间间隔(比所需时间略短,即考虑到最大已知误差),然后开始以更小的间隔轮询,直到达到所需时间为止。 - iCollect.it Ltd
@够了:当然,你可以这样做。这完全取决于你想花多少时间来构建解决方案。每30秒钟一次的滴答声不会使你的CPU崩溃。 - Peet Brits
我运行了几个测试,当没有太多其他操作时,DispatcherTimer是相当准确的。毕竟不需要轮询。 - Peet Brits

0

1
你不需要关心计时器在UI线程上运行的原因,因为你不需要高分辨率或一致性。一个Storyboard可能需要每10毫秒精确运行,而DispatcherTimer无法做到这一点。但是你只需要分钟或秒钟的分辨率,而不是毫秒级别,所以这对你来说应该是无关紧要的。 - Gabe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接