为什么这个事件会重复做了7次,该怎么处理
为什么这个事件会重复做了7次
这个事件的代码大致如上,奇怪的是, *** 处的测试代码居然在第一次被触发后连续执行了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实例就行了
- 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实例就行了