zoukankan      html  css  js  c++  java
  • 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;

    /// <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         {
    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 }

  • 相关阅读:
    uva 10900
    uva 11181
    Codeforces Round #256 (Div. 2) Multiplication Table
    UVALive 3977
    LA 4384
    Linear Regression
    Hadoop InputFormat浅析
    codeforces 432D Prefixes and Suffixes
    php学习小记2 类与对象
    php学习小记1
  • 原文地址:https://www.cnblogs.com/goooto/p/1410377.html
Copyright © 2011-2022 走看看