【问题标题】:Silverlight schedule an event at a specific timeSilverlight 在特定时间安排活动
【发布时间】:2010-10-15 06:40:52
【问题描述】:

我正在尝试找到一种方法来触发 Silverlight 事件,使其在一天中的特定时间发生。该应用程序将用完浏览器并将一直运行。我发现了一些方法,它们使用计时器每分钟触发一个事件,然后检查它是否是做某事的正确时间,但这听起来很混乱。是否有某种方式可以在例如 2010 年 9 月 23 日上午 10:34 触发事件?

【问题讨论】:

    标签: silverlight events scheduling


    【解决方案1】:

    如果您希望计时器在应用程序重新启动后仍然存在,我建议您使用轮询并在某处保留计划任务。

    否则只需将计时器间隔设置为当前时间和预定时间之间的时间跨度。

    【讨论】:

      【解决方案2】:

      我不相信 Silverlight 中有这样的功能。如果您不喜欢轮询方法,您总是可以得到 DateTime.Now 和目标时间之间的差异,并为该时间设置一个计时器。虽然我不知道这有多可靠。

      【讨论】:

      • A Timer 是这项工作的工具,我认为它没有任何理由比任何其他方法更不可靠。一个简单的代码示例将大大增强这个答案。
      • 计时器用于短时间间隔,所以我不确定这是否准确。看我的帖子。
      【解决方案3】:

      感谢您的回复。我仍然没有找到任何东西,但最终使用 StoryBoard 作为计时组件,因为 DispatcherTimer 与 UI 在同一线程中运行,而 StoryBoard 没有。

      您可以在此处阅读有关两者之间比较的更多信息。

      http://blogs.silverlight.net/blogs/msnow/archive/2009/11/09/69731.aspx

      【讨论】:

      • 您没有理由关心计时器是否在 UI 线程上运行,因为您不需要高分辨率或一致性。 Storyboard 可能需要每隔 10 毫秒运行一次,而 DispatcherTimer 无法做到这一点。但是你需要一分钟或一秒的分辨率,而不是毫秒,所以它应该与你无关。
      【解决方案4】:

      我不知道有任何控件可以满足您的要求。以下是我熟悉的计时器:

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

      我认为最好的办法是使用间隔为 30 秒的 DispatcherTimer,然后将实际时间与预期时间和日期相匹配。 据我所知,此类计时器适用于小间隔,因此较大的间隔将不太准确。 (我在纠正中)

      编辑MSDN remarks on timing:“定时器不能保证在时间间隔发生时准确执行,但保证在时间间隔发生之前不会执行。这是因为DispatcherTimer操作像其他操作一样被放置在Dispatcher 队列中。DispatcherTimer 操作何时执行取决于队列中的其他作业及其优先级。"

      【讨论】:

      • 您提到了长间隔的准确性。那么最好的情况当然是先等待一个较长的时间间隔(比所需的时间短一点,即允许最大的已知错误),然后以较小的时间间隔开始轮询,直到达到时间?
      • @Enough Already:当然,你可以这样做。这完全取决于您想在构建解决方案上投入多少时间。每 30 秒一次滴答不会杀死你的 CPU。
      • 我进行了一些测试,当没有其他事情发生时,DispatcherTimer 相当准确。毕竟不需要轮询。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 2013-09-08
      相关资源
      最近更新 更多