【问题标题】:Generic timer that works in both WinForms and other apps适用于 WinForms 和其他应用程序的通用计时器
【发布时间】:2011-03-04 20:28:34
【问题描述】:

我需要编写一个库类来执行定时操作,并定期引发一个滴答事件。我需要这个库可以在 WinForms 和非 WinForms 应用程序中使用。

问题在于线程模型对于不同类型的应用程序是完全不同的。 WinForms 应用程序甚至有自己的专用计时器,但我不知道什么类型的应用程序会调用我。

是否有既定模式可以在不事先了解将使用它的应用程序类型(WinForms、WPF、Silverlight、ASP.NET 等)的情况下安全地引发计时器事件?

【问题讨论】:

  • System.Timers 或 System.Threading.Timers 命名空间很有帮助 - .NET Framework 中的大多数其他东西只是这两个命名空间的包装器。
  • 你不能在你的库中指定定时器,它需要由客户端代码提供。线程模型是怪物。

标签: winforms multithreading design-patterns timer


【解决方案1】:

是否有既定模式可以在不事先了解将使用它的应用程序类型(WinForms、WPF、Silverlight、ASP.NET 等)的情况下安全地引发计时器事件?

框架中有一些与平台无关的计时器:System.Threading.TimerSystem.Timers.Timer。但是,这些都需要您将封送处理返回到您的同步上下文,因为它们在线程池线程上引发它们的事件。

您可以以通用方式提供此封送处理 - 即:制作一个包装上述其中之一的“计时器”类,将SynchronizationContext 作为参数。当计时器的 Tick 事件发生时,您可以Post 将数据返回到上下文。这实际上就是 Windows 窗体计时器的作用。

然后您只需在您的 UI 线程中创建它并将 SynchronizationContext.Current 传递给“新计时器”类。这适用于 Windows 窗体、WCF、WPF、Silverlight 等 - 因为它们都在其“主”线程上设置了 SynchronizationContext。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 2012-04-07
    • 2020-11-16
    • 1970-01-01
    相关资源
    最近更新 更多