2011-06-25 56 views
0

我創建了一個類,它實現了一個System.Timers.Timer與過去的事件。List <CustomObject>:自定義對象如何從列表中刪除自己?

 

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遇到錯誤和串行端口已斷開連接,我想從列表中刪除的計時器。我怎麼可能做到這一點?

+1

一般來說,框架中的所有事件處理程序都有'source'參數。 'source'通常指的是事件被註冊到的對象(在你的情況下,已經過去的單個定時器)。您應該能夠將'source'投射到'MyTimerClass'的實例並從列表中移除。也就是說,假設你在課堂中遵循了框架中的模式。我們不能肯定地說,直到我們看到你如何實現它。 –

回答

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

如果你的_timers是一個靜態變量,那麼在同一個類中創建一個靜態事件處理程序。當錯誤在計時器的ElapseEvent中引發時,請參考自身調用事件處理程序,並讓靜態事件處理程序從列表中移除錯誤的計時器。

相關問題