2011-06-25 15 views
0

私は、経過イベントでSystem.Timers.Timerを実装するクラスを作成しました。List <CustomObject>:カスタムオブジェクトがリストから自分自身を削除する方法は?

私は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); 
} 
0

Command Patternをチェックアウトする必要があります。それはあなたのために完璧であるように聞こえる。

1

_timersが静的変数の場合は、同じクラスに静的イベントハンドラを作成します。タイマーのElapseEventでエラーがスローされた場合は、自身を参照してイベントハンドラを呼び出し、静的イベントハンドラにエラーが発生したタイマーをリストから削除させます。

関連する問題