在WinForms和其他应用程序中工作的通用计时器

在WinForms和其他应用程序中工作的通用计时器,winforms,multithreading,design-patterns,timer,Winforms,Multithreading,Design Patterns,Timer,我需要编写一个库类来执行计时操作,并定期引发tick事件。我需要这个库可以从WinForms和非WinForms应用程序中使用 问题在于,对于不同类型的应用程序,线程模型是完全不同的。WinForms应用程序甚至有自己的专用计时器,但我没有;I don’我事先不知道什么类型的应用程序会给我打电话 在事先不知道将使用它的应用程序类型(WinForms、WPF、Silverlight、ASP.NET等)的情况下,是否存在安全引发计时器事件的既定模式 在事先不知道将使用它的应用程序类型(WinForm

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

问题在于,对于不同类型的应用程序,线程模型是完全不同的。WinForms应用程序甚至有自己的专用计时器,但我没有;I don’我事先不知道什么类型的应用程序会给我打电话

在事先不知道将使用它的应用程序类型(WinForms、WPF、Silverlight、ASP.NET等)的情况下,是否存在安全引发计时器事件的既定模式

在事先不知道将使用它的应用程序类型(WinForms、WPF、Silverlight、ASP.NET等)的情况下,是否存在安全引发计时器事件的既定模式

框架中有一些与平台无关的计时器:和。但是,当它们在线程池线程上引发事件时,它们都需要您将封送处理回同步上下文

您可以以一种通用的方式提供这种封送—即:创建一个“timer”类,该类封装了上述其中一个,并将a作为参数。当计时器的滴答声事件发生时,您可以将数据返回到上下文。实际上,这就是Windows窗体计时器所做的


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

System.Timers或System.Threading.Timers命名空间很有用-在.NET Framework中的大多数其他内容只是围绕这两个命名空间的包装。您不能在库中指定计时器,它需要由客户端代码提供。线程模型是monster。