There can be no Triumph without Loss,No Victory without Suffering,No Freedom without Sacrifice.
All you have to decide is what to do with the time that is given to you.
Get busy Living, or Get busy Dying?
  首页 | 留言给我 | 订阅 Rss | CLI | 黄白之恋 Posts:158   Hits: 5053962    Comments: 173    
 日历归档
<<  <  2024 - 04  >  >>
SuMoTuWeThFrSa
 123456
78910111213
14151617181920
21222324252627
282930
 About Me
 Name: ZhangSichu
 Sex: Male
 Age: 32
 Email: ZhangSichu@gmail.com
 MSN: ZhangSichu@hotmail.com
 Home: ZhangSichu.com
 WeiBo: weibo.com/zhangsichu
 个人推荐
 分类归档
  ·C++/C(5)  RSS
  ·软件工程(1)  RSS
  ·杂事/随感(26)  RSS
  ·.Net/Java(30)  RSS
  ·面向对象程序设计(5)  RSS
  ·汇编/破解(0)  RSS
  ·平面设计(3)  RSS
  ·SQL(5)  RSS
  ·COM/COM+(2)  RSS
  ·Web开发(81)  RSS
 My Friends
Back Forward Refresh Home 2024年4月16日 星期二 RSS CLI Mine Sweeper. In Javascript.

  .NET 中的Timer3胞胎
字体大小 [ ]

Win32平台上有两种线程:UI线程和工作线程。UI线程大多数时间是空闲的,它实际上是一个形如:
while(GetMessage (&msg))
{
ProcessMessage (&msg) ;
}
的循环。如果这个UI线程的消息队列中有消息, UI线程就会取出这个message并处理。工作线程没有message loop,主要用来在后台处理事务。

System.Windows.Forms.Timer Control
windows timer,其历史可以追溯到vb 1.0,主要是为了方便windows froms程序的编写。有一个Interval属性。为使用UI线程进行事务处理的单线程环境设计,依赖于OS的timer message,精度较差。操作可以在UI线程中进行,也可以在别的线程中进行。

System.Timers.Timer component
有一个Interval属性。针对server的多线程环境进行了了优化,采用了和System.Windows.Forms.Timer不同的架构。
值得注意的是System.Timers.Timer的SynchronizingObject属性。如果这个属性为null,处理Elapsed event由线程池中的线程触发,即Elapsed event的处理函数将运行在系统线程池的线程中,如果 SynchronizingObject属性被设置为一个Windows Forms component,那么Elapsed event的处理函数将运行在生成component的那个线程中,通常情况下,这个线程就是UI线程。
如果处理Elapsed event的方法的执行时间大于Interval属性的值,又会有一个线程池中的线程激发Elapsed event,Elapsed event的处理函数将会被重入。
注意:由于Elapsed event由线程池中的线程出发,存在着这样的可能:event 的处理函数正在执行,而另一个线程池中的线程调用的Timer.Stop(),这将导致在Timer.Stop()调用后Elapsed event仍可被触发。使用Interlocked.CompareExchange()可以避免这种情况。

System.Threading.Timer class
在代码中使用,不依赖于OS的Timer使用 TimerCallback delegate 来指定需要执行的函数,这个函数将执行在线程池的线程中,而不是生成System.Threading.Timer的线程中。在timer生成后,可以使用System.Threading.Timer.Change()来重新定义Timer的等待时间和执行间隔时间。
注意:如果使用了System.Threading.Timer,就要保持对Timer的引用,否则:Timer将会被GC回收,使用Timer.Dispose()可以释放Timer所占用的资源。由于callback函数由线程池中的线程执行,如果timer的interval值小于callback函数的执行时间,callback函数会被多个线程执行。如果线程池中的线程被用光,Callback函数会排队等待,不能如期执行。

ThreadPool
线程池中的线程为后台线程,其IsBackgroud为true, 当application的所有前台线程执行完毕后,就算是线程池中的线程仍在执行,application也会结束。
  Posted @ 6/9/2006 10:57:38 AM | Hits (85878) | Comment (0

  Post Comment
标题 *
作者 *
密码 记住我
评论 *
    


Stable in Firefox 1.5 2.0Stable in IE6 IE7Stable in MozillaStable in Netscape
ZhangSichu.com V0.1.7507
Powered By ZhangSichu
Copyright © ZhangSichu
Download ZhangSichu.com source code. Download source code