Autor Beitrag
BlackMatrix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Mo 24.10.11 16:18 
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:
ausblenden 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 user profile iconTh69: Beitragsformatierung überarbeitet.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4803
Erhaltene Danke: 1060

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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)...


Zuletzt bearbeitet von Th69 am Mo 24.10.11 17:46, insgesamt 1-mal bearbeitet
BlackMatrix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Mo 24.10.11 17:19 
Ah, alles klar, jetzt fällt es mir wieder ein :)

ausblenden 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:

ausblenden C#-Quelltext
1:
2:
3:
lock(this)
{
}


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4803
Erhaltene Danke: 1060

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 24.10.11 17:48 
Neue Frage - neues Thema ;-)