首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

为什么这个事件会重复做了7次,该怎么处理

2012-04-21 
为什么这个事件会重复做了7次C# codepublic delegate void TimingEventHandler(object sender, TimingEven

为什么这个事件会重复做了7次

C# code
    public delegate void TimingEventHandler(object sender, TimingEventArgs e);     public sealed class TimingController    {        // 省略单例模式代码        MachineParameters Machines = MachineParameters.GetInstance();        private Timer TimerGlobal;        public event TimingEventHandler WarmedUp;        private TimingController()        {            //定时器初始化        }        public void Start()        {            TimerGlobal.Enabled = true;        }        void TimerGlobal_Elapsed(object sender, ElapsedEventArgs e)        {            for (int i = 1; i < 8; i++)            {                Machines.M[i].ClockStep += 100;                TimingEventArgs e = new TimingEventArgs(Machines.M[i].ClockStep);                CheckWarmedUp(Machines.M[i], e);            }        }        private void CheckWarmedUp(object sender, TimingEventArgs e)        {            Machine machine = (Machine)sender;            if (machine.ClockStep == machine.WarmUpTime)            {                //UpdateData.UpdateMachine(sender, e);###                WarmedUp(sender, e);            }        }        void OnWarmedUp(object sender, TimingEventArgs e)        {            if (WarmedUp != null)            {                WarmedUp(sender, e);            }        }    public sealed class UpdateData    {        // 省略单例模式代码                public void UpdateMachine(object sender, TimingEventArgs e)        {            Machine machine = (Machine)sender;***            Trace.WriteLine(id.ToString() + "------" + e.ClockRate.ToString());        }    }    public class Machine //实例类    {        TimingController Timing = TimingController.GetInstance();        UpdateData Update = UpdateData.GetInstance();        //省略其余定义        //类中用到了 TimingController 和 UpdateData ,因此声明如上        public Machine(int id)        {            Timing.WarmedUp += new TimingEventHandler(Update.UpdateMachine);        }    }        


这个事件的代码大致如上,奇怪的是, *** 处的测试代码居然在第一次被触发后连续执行了7次,(定时器事件间隔1秒,所以应该不是定时器时间太短造成指令来不及处理引起的)
但如果我在 ### 处的代码不用 WarmedUp(sender, e); 来委托,直接用上一行被注释掉的 UpdateData.UpdateMachine(sender, e); 则没问题,***被正常执行一遍
这就奇怪了,我在###处设置断点追踪,发现程序跳转到 *** 后会在***那个UpdateMachine函数连续执行好几次,然后回到###处的判断代码一两次,再回到***处,如是一共7次。7个 Machines.M[i] 各7次,让人摸不着头脑

请问这个问题如何解决?

[解决办法]
TimingController Timing = TimingController.GetInstance();

public Machine(int id)
{
Timing.WarmedUp += new TimingEventHandler(Update.UpdateMachine);
}
单例模式,结果Timing 也被莫名单例了。。
造成Machines[i]实例化的时候,重复调用,单例模式的Timing
[解决办法]
Timing.WarmedUp += new TimingEventHandler(Update.UpdateMachine);

单例模式下,Timing被重复绑定事件了
[解决办法]
Machine做单例, 或者不用事件
[解决办法]
其实你只需要绑定一个事件,然后触发的时候根据id判断触发哪个Machine实例就行了

热点排行