Entwickler-Ecke
WinForms - DataReceived beißt sich nur im Debug mit Control zugriff?
avoid - Mo 24.08.15 20:56
Titel: DataReceived beißt sich nur im Debug mit Control zugriff?
Ich bastele mir gerade mal wieder ein kleines Tool in VC#2010 und wundere mich grün und blau.
Hier erst mal der Code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { string empfang = null; try { empfang = serialPort1.ReadExisting(); textBox_raw.AppendText(empfang); } catch { } } |
wenn ich den Code im Debug des VisualStudio laufen lasse wird nichts an die TextBox übergeben, weil der zugriff auf die TextBox aus dem Ereignis nicht geht.
Threat übergreifendes bla bla bla eben.
Starte ich die Kompilierte exe unter win7 oder win8 läuft es komischerweise ohne zicken und zeigt auch brav an was rein kommt.
Kann mir wer erklären warum das so ist und wie ich den Debug dazu bekomme nicht so rum zu zicken?
gruß,
avoid
avoid - Di 25.08.15 19:12
ich verstehe was du meinst aber selbst nach lesen deiner links und der MSDN Seite zu dem befehlt, verstehe ich nicht was ich in den vorderen teil als Delegate eintragen muss.
liegt wohl daran das mir Delegate nix sagt. ;)
jfheins - Di 25.08.15 19:36
Also ein Delegate könnte man auch als Callback oder Funktionszeiger beschreiben. Es gibt immer einen Delegat-Typen der eine Methodensignatur beschreibt (Parameter, Rückgabewert) und die Methoden eines Objekts, die auf diesen Delegat-Typ "passen".
Hier gibt es die BeginInvoke Methode des Formulars. Diese führt Code im Threadkontext des Formulars aus. Alleine ist das aber witzlos, die muss ja wissen WELCHEN Code sie ausführen soll. Deshalb übergibt man dem BeginINvoke wiederum eine Methode, die dann ausgeführt wird.
Vergleich:
C#-Quelltext
1:
| this.BeginInvoke(UpdateGUI()); |
Würde zunächst die Methode UpdateGUI()
ausführen und das Ergebnis dann der Methode BeginInvoke übergeben.
C#-Quelltext
1:
| this.BeginInvoke(UpdateGUI); |
Jedoch ruft
nur BeginInvoke auf. Was BeginInvoke dann mit der Methode UpdateGUI macht, kann man erst mal nicht sagen. (Logisch betrachtet wird sie aber irgendwann ausgeführt, sonst wäre das übergeben eines Delegates witzlos)
Da der Delegat-Typ jetzt noch nicht ganz passt, wird eine anonyme Methode erzeugt. Syntax:
() => { ... } Und diese dann auf den Typ Action gecastet.
C#-Quelltext
1: 2: 3: 4:
| this.BeginInvoke((Action)(() => { textBox_raw.AppendText(empfang); })); |
Innerhalb der anonymen Methode kannst du dann machen was du willst.
Ralf Jansen - Di 25.08.15 20:30
| Zitat: |
| Da der Delegat-Typ jetzt noch nicht ganz passt, wird eine anonyme Methode erzeugt. |
Um mal kurz den Klugscheißer rauszuholen obwohl es natürlich logisch identisch ist nur syntaktisch ganz leicht anders, das ist ein Lambdaausdruck keine anonyme Methode.
Anonyme Methode sähe so aus.
C#-Quelltext
1:
| this.BeginInvoke((Action)delegate() { textBox_raw.AppendText("blub"); }); |
avoid - Mi 26.08.15 19:29
a ha!
Action ist ein Typ (quasi ein Delegate Typ) und kein Platzhalter für irgend etwas anderes.
Na das macht es doch schon verständlicher.
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!