日期:2014-05-18  浏览次数:20909 次

为什么这个事件会重复做了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实例就行了