我创建了一个实现带有elapse事件的System.Timers.Timer
的类。
private void ElapseEvent(object source, ElapsedEventArgs e){
//read from serial port device
}
在主程序中,我有private List<MyTimerClass> _timers
。
我动态启动计时器并将其添加到计时器列表中。
var timer1= new MyTimerClass();
timer1.Execute("Device A");
_timers.Add(timer1);
var timer2= new MyTimerClass();
timer2.Execute("Device B");
_timers.Add(timer2);
当ElapseEvent
遇到错误并且串口断开连接时,我想从列表中删除计时器。我怎么可能这样做?
答案 0 :(得分:2)
您可以在包含计时器的类中添加OnError方法。为了让父类知道发生错误。如下所示:
在MyTimerClass
public MyTimerClass(Action<MyTimerClass, Exception> onError)
{
this.onError = onError;
}
private void ElapseEvent(object source, ElapsedEventArgs e){
try{
//read from serial port device
}
catch(Exception ex) // It would be better if you know the exceptions you want to handle
{
if(this.onError != null)
{
this.onError(this, ex);
}
}
}
在父类:
var timer1= new MyTimerClass(this.OnTimerError);
timer1.Execute("Device A");
_timers.Add(timer1);
var timer2= new MyTimerClass(this.OnTimerError);
timer2.Execute("Device B");
_timers.Add(timer2);
public void OnTimerError(MyTimerClass timer, Exception error)
{
//Log the exception
_timers.Remove(timer);
}
答案 1 :(得分:1)
如果_timers是静态变量,则在同一个类中创建静态事件处理程序。当在计时器的ElapseEvent
中抛出错误时,调用事件处理程序并引用自身,并让静态事件处理程序从列表中删除错误的计时器。
答案 2 :(得分:1)
答案 3 :(得分:0)
你应该查看Command Pattern;听起来对你来说是完美的。