.NET一共有3个Timer: 1. System.Windows.Forms.Timer: 这是你说的(因为有Tick事件)。是通过Windows消息出发OnTimer事件的,Tick事件总是触发在程序的主线程(UIThread)上(1. 不是新线程)。如果主线程忙(例如,上一次的Tick还没有执行完),消息就得不到及时处理(2. 等待前一个完成)。 2. System.Timer.Timer和System.Threading.Timer: 前者是通过调用Windows的WaitableTimer实现的,后者是.NET的简单的Thread.Sleep实现。两个实现都是用了.NET线程池(ThreadPool),所以Elapsed事件会在ThreadPool里选择一个线程执行(1. 不一定是新线程,但肯定不是建立Timer的线程)。这样做的好处是如果前一次Elapsed没有完成,后一次的可以从ThreadPool里选一个新的线程开始执行。(2. 在新线程上直接开始)。 |
|
来自: goodwangLib > 《C#》