System.Timers 防止事件处理程序的可重入问题解决方案

对付重入问题通常的办法是加锁,但是对于   Timer却不能简单的这样做,你需要评估一下 
首先Timer处理里本来就不应该做太需要时间的事情,或者花费时间无法估计的事情,比同远方的服务器建立一个网络连接,这样的做法尽量避免 
如果实在无法避免,那么要评估Timer处理超时是否经常发生,如果是很少出现,那么可以用lock(Object)的方法来防止重入 
如果这种情况经常出现呢?那就要用另外的方法来防止重入了 
我们可以设置一个标志,表示一个Timer处理正在执行,下一个Timer发生的时候发现上一个没有执行完就放弃执行 
static     int   inTimer   =   0; 
public   static   void   threadTimerCallback(Object   obj) 

          if   (   inTiemr   ==   0   ) 
        { 
                  inTimer   =   1;                   
                  Console.WriteLine( "Time:{0},   \tThread   ID:{1} ",   DateTime.Now,   Thread.CurrentThread.GetHashCode()); 
                  Thread.Sleep(2000); 
                  inTimer   =   0; 
            } 

但是在多线程下给inTimer赋值不够安全,还好Interlocked.Exchange提供了一种轻量级的线程安全的给对象赋值的方法 
  static   int   inTimer   =   0; 
  public   static   void   threadTimerCallback(Object   obj) 
  { 
              if   (   Interlocked.Exchange(ref   inTimer,   1)   ==   0   ) 
            { 
                      Console.WriteLine( "Time:{0},   \tThread   ID:{1} ",   DateTime.Now,   Thread.CurrentThread.GetHashCode()); 
                      Thread.Sleep(250); 
                      Interlocked.Exchange(ref   inTimer,   0); 
            } 
  } 

posted @ 2013-08-11 16:09  therockthe  阅读(400)  评论(0)    收藏  举报