Entwickler-Ecke
Basistechnologien - Probleme beim Event-Handling
glowhand - Mo 26.07.10 18:44
Titel: Probleme beim Event-Handling
Hallo!
Ich bin ein ziemlicher .NET-Anfänger und habe eine hoffentlich einfach zu beantwortende Frage:
Anscheinend kann ich in Methoden, die per EventHandling aufgerufen wurden, nicht auf lokale Klassenattribute zugreifen. Wie mache ich das möglich?
Beispiel:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| private void button1_Click(object sender, EventArgs e) { Session sess = new Session(); sess.itemReceived += new FooBarHandler("foo_bar"); }
private void foo_bar(Session sess, Item item) { MessageBox.Show("foobar"); this.TexBox.Text = "item received"; } |
Der Compiler gibt keine Fehlermeldung aus und es wird auch kein Laufzeitfehler ausgegeben :(
Lg,
Christian.
Kha - Mo 26.07.10 19:06
Doch, das ist auf jeden Fall möglich, es kompiliert ja schließlich auch. Das Verhalten muss einen anderen Grund haben (hoffentlich nicht CheckForIllegalCrossThreadCalls = false gesetzt ;) )?
glowhand - Mo 26.07.10 19:09
Kha hat folgendes geschrieben : |
| Doch, das ist auf jeden Fall möglich, es kompiliert ja schließlich auch. Das Verhalten muss einen anderen Grund haben (hoffentlich nicht CheckForIllegalCrossThreadCalls = false gesetzt ;) )? |
Hi,
habe CheckForIllegalCrossThreadCalls nochmal explizit auf true gesetzt, trotzdem ändert sich da nichts. Weiterhin keine Fehlermeldung.
Merkwürdig.
Yogu - Mo 26.07.10 20:17
Vielleicht wird
itemReceived aus einem anderen Thread aus aufgerufen, aber dann müsste eigentlich eine Exception geworfen werden, wenn der Schalter, den
Kha angesprochen hat, nicht abgeschaltet ist. Du könntest aber einfach mal versuchen, es so zu machen, wie man es im Falle dieser Exception tun würde:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| private void button1_Click(object sender, EventArgs e) { Session sess = new Session(); sess.itemReceived += new FooBarHandler("foo_bar"); }
private void foo_bar(Session sess, Item item) { MessageBox.Show("foobar"); setTextBoxText("item received"); }
private void setTextBoxText(string text) { if (TextBox.InvokeRequired) TextBox.Invoke(new Action<string>(setTextBoxText), text); else TexBox.Text = text; } |
Die Methode
setTextBoxText prüft, ob der Text der Textbox ohne weiteres geändert werden kann, und wenn nicht, ruft sie sich selbst im Hauptthread auf. Schau auch mal per Einzelschritt, ob
Invoke verwendet wird.
Grüße,
Yogu
glowhand - Mo 26.07.10 20:37
Hey,vielen lieben Dank, so funktioniert es.
Frage ist nun: Wieso wird keine Exception geworfen :(
Das Session-Objekt ist eigentlich Teil einer fremden Library, deren Implementierung mich eigentlich recht wenig interessiert. Will mich da ungern einarbeiten, nur, um Fehler ausfindig zu machen, die Visual Studio nicht ausgibt.
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!