1.timer的tick事件触发后是单独起一个线程吗?//是一个个单独的线程2.如果在一个interval时间段内没有完成tick事件内的代码,到下一个tick事件是等待前一个完成,还是直接开始?
//直接开始

解决方案 »

  1.   

    此类型的所有公共静态(Visual Basic 中为 Shared)成员对多线程操作而言都是安全的。但不保证任何实例成员是线程安全的。备注
    使用 TimerCallback 委托指定与 Timer 关联的方法。这些方法不在创建计时器的线程中执行;它们在系统自动分配的单独线程中执行。计时器委托在构造计时器时指定,并且不能更改。创建计时器时,应用程序指定在第一次调用委托方法之前等待的时间量(截止时间)以及后面的调用之间等待的时间量(时间周期)。当截止时间过期时,计时器调用它的方法,并在此之后每个时间周期调用一次它的方法。通过使用 Change 方法,可以更改这些值,也可以禁用计时器。当不再需要计时器时,请使用 Dispose 方法释放计时器持有的资源。
      

  2.   

    .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. 在新线程上直接开始)。