Entwickler-Ecke
Basistechnologien - Timer mit Zusatzinformation?
BlackMatrix - Mo 24.10.11 16:18
Titel: Timer mit Zusatzinformation?
Hi.
Wenn ich verschiedene Timer mit verschiedenen Intervallen habe, aber alle die gleiche Ereignisbehandlungsroutine ausführen, ich aber innerhalb dieser Behandlung wissen muss, welcher Timer das Ereignis ausgelöst hat, wie macht man das Richtlinienkomform?
Also:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| Timer1 = new Timer(30000); Timer1 .Elapsed += Timer_Elapsed; Timer1 .AutoReset = false;
Timer2 = new Timer(45000); Timer2 .Elapsed += Timer_Elapsed; Timer2 .AutoReset = false; |
Bisher habe ich dann in Timer_Elapsed über eine SwitchAnweisung des Intervals, welches eingestellt ist, den Timer herausgefunden.
Leitet man da von ElapsedEventArgs ab oder wie macht man das genau? Ich brauche innerhalb der Methode "Timer_Elapsed" noch eine string Varialbe, die sich aus dem Timer erschließt, der die Methode aufgerufen hat.
LG
Moderiert von
Th69: Beitragsformatierung überarbeitet.
Th69 - Mo 24.10.11 16:55
Hallo BlackMatrix,
so wie jede Standard-Ereignismethode, bietet auch Timer.Elapsed als ersten Parameter den 'sender' an, d.h. die konkrete Instanz deines Timers:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| public void Timer_Elapsed(object sender, ElapsedEventArgs e) { Timer timer = sender as Timer;
} |
Leider verfügt der Timer nicht über eine Tag-Eigenschaft, um ein benutzerspezifisches Objekt daran zu hängen.
Ich persönlich würde dann per Lamba-Ausdruck einfach eine eigene Methode aufrufen:
C#-Quelltext
1: 2: 3:
| Timer1.Elapsed += (s, e) => MyTimer_Elapsed("Timer1");
Timer1.Elapsed += (s, e) => MyTimer_Elapsed("Timer2"); |
P.S: von ElapsedEventArgs abzuleiten bringt nichts, da du ja nicht selber die Timer-Methode aufrufst (außer du übergibst der MyTimer-Elapsed-Methode dieses neue EventArgs-Objekt)...
BlackMatrix - Mo 24.10.11 17:19
Ah, alles klar, jetzt fällt es mir wieder ein :)
C#-Quelltext
1: 2: 3: 4:
| Timer timer = sender as Timer; if (timer == Timer1) { } |
Danke
edit:
Eine Frage hätte ich noch:
In der Ereignisbehandlungsroutine wird ein lock Anweisungnsblock ausgeführt:
Kann ich nun mit dem System.Timers.Timer dafür sorgen, dass ein bestimmter Timer eine höhere Priorität hat, als ein anderer, sodass wenn der höher priorisierte Timer gerade im lock ist, aber bereits erneut das Elasped Ereignis aufgerufen wird, gleich wieder der höher priorisierte ran darf? Oder geht das nur mit einem System.Threading.Timer oder doch ganz anders?
Th69 - Mo 24.10.11 17:48
Neue Frage - neues Thema ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!