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次,让人摸不着头脑

请问这个问题如何解决?

解决方案 »

  1.   

    你是在循环里执行的for (int i = 1; i < 8; i++)
      

  2.   


    每天回帖即可获得10分可用分
    1 2 3 4 5 6 7 8(i < 8)不成立
      

  3.   

    你是指timer的循环?
    那为什么这两句的一个对一个不对呢?WarmedUp(sender,e)经过委托也是去执行//UpdateData.UpdateMachine(sender, e); 这句话啊                //UpdateData.UpdateMachine(sender, e);
    ###                WarmedUp(sender, e);
      

  4.   

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

  5.   

     Timing.WarmedUp += new TimingEventHandler(Update.UpdateMachine);单例模式下,Timing被重复绑定事件了
      

  6.   


    哦我明白了,就算不是单例,生成7个Machine实例的时候也把事件绑定了7次到委托链里
    那么如何解决,我想是不是应该针对7个Machine写7个委托事件并注册到对应的实例中的构造函数呢?
      

  7.   

    public sealed class TimingController

    MachineParameters Machines = MachineParameters.GetInstance();}
    你把Machines 定义到TimingController里面,然后对每个Machine[i],都调用了同一个TimingController.Timing(单例).委托连不能用单例..
    建议你把事件写在Machine类里面
      

  8.   

    Machine做单例, 或者不用事件
      

  9.   


    Machine有7个实例,总不能写 Machine1 ~ Machine 7 这样7个类吧?
    我在另一个单例模式出问题的帖子里听取大家意见,不用单例了
    http://topic.csdn.net/u/20120416/18/8937f80a-2c1c-41ad-ad81-15eacfd2a53a.html?seed=55598763&r=78265705#r_78265705
    用 Machine类 生成 7个 static的全局静态成员
    但是这样就不方便在 Machine里加事件了,轮询的时候还是会出现7次可能真的只能如你所说不用事件了?
      

  10.   

    其实你只需要绑定一个事件,然后触发的时候根据id判断触发哪个Machine实例就行了