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

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

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值