C#多线程--在不同线程之间通过事件委托封送调用方法

   前两天做了一个自定义单件Timer,该Timer能够根据相应数据记录(Row)中的记录ID和设定分钟Minutes 做相应的事件调用,但是如果此事件处理程序在一Form中时则不能正确调用它,但是把82到93行的注释去掉就可以了。

    Timer大体定义如下:

  1  using  System;
  2  using  System.Threading;
  3  using  System.ComponentModel;
  4  using  System.Windows.Forms;
  5 
  6  /* ***********************************************************
  7   * MyTimer.Timer能够根据同一Timer定时基准对不同的定时事件做定时。
  8   * 
  9   * MyTimer.Timer包含一Hashtable和Threading.Timer,每次Timer定时回调
 10   * 遍历Hashtable并根据其中的TimerNode的定时周期值是否为零来判断是否调用
 11   * 相应的TimerCome事件。
 12   ************************************************************  */
 13  namespace  MyTimer
 14  {
 15       ///   <summary>
 16       ///  事件定时节点
 17       ///   </summary>
 18       internal   class  TimerNode
 19      {
 20           ///   <summary>
 21           ///  构造函数
 22           ///   </summary>
 23           ///   <param name="TimeCount"> 定时周期数 </param>
 24           ///   <param name="EvtID"> 事件ID </param>
 25           public  TimerNode( long  TimeCount, object  EvtID)
 26          {
 27               this .mTimeCount = TimeCount;
 28               this .mEvtID = EvtID;
 29          }
 30           private   long  mTimeCount;
 31           private   object  mEvtID;
 32 
 33           public   long  TimeCount
 34          {
 35               get { return  mTimeCount;}
 36               set {mTimeCount = value;}
 37          }
 38           public   object  EvtID
 39          {
 40               get { return  mEvtID;}
 41          }
 42      }
 43 
 44       public   class  TimerEventArgs:EventArgs
 45      {
 46           private  System.Collections.ArrayList mEvtIDs;
 47           public  System.Collections.ArrayList EvtIDs
 48          {
 49               get { return  mEvtIDs;}
 50          }
 51 
 52           ///   <summary>
 53           ///  构造
 54           ///   </summary>
 55           ///   <param name="EvtIDs"> 触发的事件ID列表 </param>
 56           public  TimerEventArgs(System.Collections.ArrayList EvtIDs): base ()
 57          {
 58               this .mEvtIDs = EvtIDs;
 59          }
 60      }
 61 
 62       public   delegate   void  TimerEventHandler(TimerEventArgs e);
 63 
 64       ///   <summary>
 65       ///  Timer 单件模式,不能实例化。
 66       ///   </summary>
 67       public   class  Timer
 68      {
 69           ///   <summary>
 70           ///  有节点定时到事件
 71           ///   </summary>
 72           public   static   event  TimerEventHandler TimeCome;
 73 
 74           ///   <summary>
 75           ///  唤醒TimeCome事件。
 76           ///   </summary>
 77           ///   <param name="e"> 此参数包含定时到事件列表 </param>
 78           static   void  RaiseTimeCome(TimerEventArgs e)
 79          {
 80               if (TimeCome != null )
 81              {
 82  //                 if(TimeCome.Target is System.ComponentModel.ISynchronizeInvoke)
 83  //                 {
 84  //                     System.ComponentModel.ISynchronizeInvoke aSynch=TimeCome.Target as System.ComponentModel.ISynchronizeInvoke;
 85  //                     if(aSynch.InvokeRequired)
 86  //                     {
 87  //                         object[] args=new object[1]{e};
 88  //                         aSynch.BeginInvoke(TimeCome,args);
 89  //                     }
 90  //                     else
 91  //                         TimeCome(e);
 92  //                 }
 93  //                 else
 94                      TimeCome(e);
 95              }
 96          }
 97           static   readonly   long  mPeriod = 1000 * 60 ; // 定时间隔1分钟。
 98           static  System.Threading.Timer mTimer;
 99           static  Timer()
100          {
101              mTimer = new  System.Threading.Timer( new  TimerCallback(TimeArrive), null ,Timeout.Infinite,mPeriod);
102          }
103 
104           ///   <summary>
105           ///  定时器开始运行
106           ///   </summary>
107           public   static   void  Run()
108          {
109              mTimer.Change( 0 ,mPeriod);
110          }
111 
112           ///   <summary>
113           ///  定时器停止。
114           ///   </summary>
115           public   static   void  Stop()
116          {
117              mTimer.Change(Timeout.Infinite,mPeriod);
118          }
119 
120           ///   <summary>
121           ///  加入定时事件,如果此定时事件已存在则修改其定时周期。
122           ///   </summary>
123           ///   <param name="EvtID"> 事件ID </param>
124           ///   <param name="TimeCount"> 周期数 </param>
125           public   static   void  Add( object  EvtID, long  TimeCount)
126          {
127               if (mTimerNodes.ContainsKey(EvtID))
128              {
129                  ((TimerNode)mTimerNodes[EvtID]).TimeCount = TimeCount;
130              }
131               else
132                  mTimerNodes.Add(EvtID, new  TimerNode(TimeCount,EvtID));
133          }
134 
135           ///   <summary>
136           ///  移除此定时事件
137           ///   </summary>
138           ///   <param name="EvtID"> 事件ID </param>
139           public   static   void  Remove( object  EvtID)
140          {
141               if (mTimerNodes.ContainsKey(EvtID))
142                  mTimerNodes.Remove(EvtID);
143          }
144 
145           ///   <summary>
146           ///  此函数是基准定时器mTimer的回调函数,
147           ///  在此函数中将检查事件表,如期事件定时周期数已到则将其加入事件参数中
148           ///  并唤醒事件。
149           ///   </summary>
150           ///   <param name="state"></param>
151           static   void  TimeArrive( object  state)
152          {
153              System.Collections.ArrayList EvtIDs = new  System.Collections.ArrayList();
154               foreach (TimerNode aNode  in  mTimerNodes.Values)
155              {
156                  aNode.TimeCount -- ;
157                   if (aNode.TimeCount <= 0 )
158                  {
159                      EvtIDs.Add(aNode.EvtID);
160                  }
161              }
162               if (EvtIDs.Count > 0 )
163              {
164                   for ( int  i = 0 ;i < EvtIDs.Count;i ++ )
165                  {
166                      mTimerNodes.Remove(EvtIDs[i]);
167                  }
168                  RaiseTimeCome( new  TimerEventArgs(EvtIDs));
169              }
170          }
171 
172           ///   <summary>
173           ///  事件表
174           ///   </summary>
175           static  System.Collections.Hashtable mTimerNodes = new  System.Collections.Hashtable();
176      }
177 
178 
179  }
180 

 

转载于:https://www.cnblogs.com/zxt1225/archive/2006/07/07/445444.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值