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次,让人摸不着头脑
请问这个问题如何解决?
解决方案 »
- WIN7开发的winform为何在xp上无法打开?
- XML序列化的问题,能序列化但无法反序列化?
- 请大家指点一下这个算法!!!
- win form不规则窗体bmp背景图锯齿毛边问题
- 我在.net 环境下 用C#编的程序 所生成的.EXE 文件在别的电脑上怎么不能运行啊
- 求助~~关于datetime中求相减的时间问题
- 【【【最后80分问个简单问题,连接数据库并写入数据!!!】】】
- 原exe文件使用混淆和强命令,反编译后无法生存
- OleDbDataAdapter.fill 插入DataTable中并转为Excel 列错位了。
- ◎有谁用C#做过LiveUpdate(在线更新)程序么?(急)
- C#字符串去重的方法
- 如何重写串口控件的事件?
每天回帖即可获得10分可用分
1 2 3 4 5 6 7 8(i < 8)不成立
那为什么这两句的一个对一个不对呢?WarmedUp(sender,e)经过委托也是去执行//UpdateData.UpdateMachine(sender, e); 这句话啊 //UpdateData.UpdateMachine(sender, e);
### WarmedUp(sender, e);
{
Timing.WarmedUp += new TimingEventHandler(Update.UpdateMachine);
}
单例模式,结果Timing 也被莫名单例了。。
造成Machines[i]实例化的时候,重复调用,单例模式的Timing
哦我明白了,就算不是单例,生成7个Machine实例的时候也把事件绑定了7次到委托链里
那么如何解决,我想是不是应该针对7个Machine写7个委托事件并注册到对应的实例中的构造函数呢?
{
MachineParameters Machines = MachineParameters.GetInstance();}
你把Machines 定义到TimingController里面,然后对每个Machine[i],都调用了同一个TimingController.Timing(单例).委托连不能用单例..
建议你把事件写在Machine类里面
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次可能真的只能如你所说不用事件了?