更多细节-有关定时器
在应用程序中需要一个定时器来引发一个定期的任务一定不一般。例如,如果你的程序在窗体的状态条上显示当前时间,你可能每5秒钟更新一次时间。System.Threading 名字空间包括了一个名为Timer多线程定时器类。
当你创建一个定时器类的实例时,你为定时器回调指明了一个以毫秒为单位的周期,而且你也传递给该对象一个委托用来每过一个时钟周期调用你。回调发生在线程池中的线程上。事实上,每次时钟周期到来时真正发生的是一个工作条目在线程池中排队;一般来说一个调用会马上发生的,但是如果线程池比较忙,这个回调也许会在稍后的一个时间点发生。
如果你考虑在你的程序中使用多线程,你也许会考虑使用定时器类。然而,如果你的程序使用了Windows窗体,你不必使用多线程的行为,在System.Windows.Forms名字空间中有另外一个也叫Timer的定时器类。
System.Windows.Forms.Timer与其多线程的同伴比起来有一个明显的好处:因为它不是多线程的,所以不会在其它线程中对你进行回调,而且更适合为应用程序提取窗口消息的主线程。实际上System.Windows.Forms.Timer的实现是在系统中使用了WM_TIMER的一个窗口消息。这种方法在你的System.Windows.Forms.Timer的事件处理器中不必担心线程同步,线程间通信之类的问题。
对于Windows窗体类程序,作为一个很好的技巧就是使用System.Windows.Forms.Timer类, 除非你特别需要线程池中的线程对你进行回调。既然这种要求很少见,为了使事情简单,把使用System.Windows.Forms.Timer作为一个规则,即使在你的程序的其它地方使用了多线程。
展望将来 微软最近展示了一个即将出现的GUI API,代号为“Avalon”,本期MSDN杂志的问题列表中(见70页)Charles Petzold''''s的文章描述了其特点。在Avalon框架中用户接口元素没有被系与一个特殊的线程;作为更换每个用户接口元素与一个单独的逻辑线程上下文相关联,在UIContext类中实现。但是当你发现UIContext类中包含了Invoke方法,及其姊妹BeginInvoke时,你就不会惊奇了,在名字上与窗体类中的控件类上名称一样的目的是说明他们在逻辑作用上是一致的。
作者简介 Jason Clark 为微软和Wintellect公司提供培训和咨询,他是Windows NT和Windows 2000服务器团队的开发前辈。他是Windows 2000服务器程序编程一书的合著者。与Jason的联系方式:JClark@Wintellect.com
查看本文来源