【发布时间】:2013-07-15 08:33:57
【问题描述】:
场景:我正在构建一个调度系统,我希望每个计时器事件都运行一个自定义方法,而不是通常的Timer.Elapsed 事件。
所以我写了这样的东西。
foreach (ScheduleElement schedule in schedules) {
TimeSpan timeToRun = CalculateTime(schedule);
schedule.Timer = new Timer(timeToRun.TotalMilliseconds);
schedule.Timer.Elapsed += delegate { Refresh_Timer(schedule); };
schedule.Timer.AutoReset = true;
schedule.Timer.Enabled = true;
}
好的,很简单,实际上确实创建了我的计时器。但是,我希望每个 elapsed 事件都使用它传入的 schedule 元素运行。我的问题是,为什么 Elapsed 事件仅在 for 循环中的最后一个 ScheduleElement 中为每个 Timer.Elapsed 事件传递。
现在我知道是什么解决了它,我只是不知道为什么。如果我回滚到原始 Timer.Elapsed 事件并用我自己的类扩展 Timer 类,我可以解决它。像这样。
解决方法:
foreach (ScheduleElement schedule in schedules) {
TimeSpan timeToRun = CalculateTime(schedule);
schedule.Timer = new TimerEx(timeToRun.TotalMilliseconds);
schedule.Timer.Elapsed +=new System.Timers.ElapsedEventHandler(Refresh_Timer);
schedule.Timer.Tag = schedule;
schedule.Timer.AutoReset = true;
schedule.Timer.Enabled = true;
}
然后我将object sender 转换回其原始对象,并从其中窃取Tag 属性,这为我提供了每个唯一计时器的正确时间表。
那么,为什么在所有计时器的 foreach 循环中只使用delegate { } 只传递最后一个ScheduleElement?
编辑 1
定时器类
public TimerEx : Timer {
public TimerEx(double interval) : base(interval) { }
private Object _Tag;
public Object Tag {
get { return _Tag; }
set { _Tag = value; }
}
}
【问题讨论】:
-
研究“闭环”