Entwickler-Ecke
WinForms - Aufruf von Events innerhalb Events automatisch unterbunden?
bernieserver - Di 05.10.10 15:08
Titel: Aufruf von Events innerhalb Events automatisch unterbunden?
Hallo,
ich habe eine ganz allgemeine Frage:
Wenn ich mich innerhalb eines Events von z.B. einer ComboBox befinde und ich den Auslöser des Events intern verändere, wird dann der gleiche Event wieder aufgerufen oder wird das unterbunden? Wenn ja/ nein: Gibt es Sonderregeln bzw. Situationen wo das anders ist?
Als kleines zwei Zeilen Bspl:
private void comboBoxtest_SelectedIndexChanged(object sender, EventArgs e)
{
this.comboboxtest.SelectedIndex = 2; // Wird hier Event ausgelöst?
}
Denn derzeitig melde ich den Eventhandler immer vor einer Änderung mit -= ab und anschließend mit += wieder an. Ist das notwendig?
Gruß
Bernhard N.
Th69 - Di 05.10.10 15:35
Üblicherweise verwendet man dazu einfach eine boolesche Variable (anstatt dem Abhängen und wieder Anhängen):
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| private bool exclude_event = false;
private void comboBoxtest_SelectedIndexChanged(object sender, EventArgs e) { if(exclude_event) return;
exclude_event = true; this.comboboxtest.SelectedIndex = 2; exclude_event = false; } |
Wenn jedoch an dem Event noch andere Methoden hängen, so werden diese dann trotzdem aufgerufen.
Nützlich dürfte für dich auch folgender Beitrag sein
Event nur bei Benutzeraktion auslösen, nicht bei programmtechnischer Änderung [
http://www.mycsharp.de/wbb2/thread.php?threadid=73593]
bernieserver - Do 07.10.10 09:00
Danke. Also war die anfängliche Version mit Flags (die ich vorher einsetzte) gar nicht so verkehrt.
Wie sieht es denn mit der Atomarität der Ausführung aus? Können Eventaktionen per Default unterbrochen werden?
Gruß
Bernhard
Th69 - Do 07.10.10 09:52
Hallo,
Events werden völlig sequentiell abgearbeitet, d.h. treten innerhalb eines Events andere auf, so werden diese dann erst weiter abgearbeitet (evtl. sogar rekursiv!) und so weiter.
Dies bezieht sich selbstverständlich nur auf den Thread, in dem die Events abgearbeitet werden - andere Threads können selbstverständlich die Events unterbrechen (technisch gibt es keinen Unterschied zwischen Events und normalen Methoden). Und von "atomar" kann man hier auch nicht wirklich reden.
Bei einem WinForms-Timer könnte es sogar sein, daß dieser verzögert erst aufgerufen wird (wenn ein Event zu lange zum Abarbeiten braucht). Als Standardregel sollte gelten, daß Events (im GUI-Thread) nicht länger als ca. 10ms dauern sollten (alles andere sollte dann in separate Threads ausgelagert werden).
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!