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

来源这里

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值