verständnis problem Control.Invoke C#

OP #1099421
Lesenswert?

Hallo,
Ich bin schon wieder bei einem Problem angelangt wo ich die Hilfe 
einfach nicht verstehe!!
1
 
2

3
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
4
        {
5
            ComOut3 Message = new ComOut3();
6
            byte[] array = new byte[6];
7
            if (serialPort1.Read(array, 0, 6) == 6)
8
            {
9
                Message.start = array[0];
10
                Message.adres = array[1];
11
                Message.eine_nummer = (int)array[2];    
12
                Message.eine_nummer += (int)array[3] << 8;
13
                Message.chksum = array[4];
14
                Message.ende = array[5];
15
            }
16
            char[] buff = new char[1];
17
            buff[0] = (char)Message.start;
18
            serialPort1.Write(buff, 0, 1);
19
            buff[0] = (char)Message.ende;
20
            serialPort1.Write(buff, 0, 1);
21
            //TB_rx1.Invoke = (newMethodInvoker(serialPort1_DataReceived));
22
            TB_rx1.Text = string.Format("{0:x2}", Message.start);
23
            TB_rx2.Text = string.Format("{0:x2}", Message.adres);
24
            TB_rx3.Text = string.Format("{0:d6}", Message.eine_nummer);
25
            TB_rx4.Text = string.Format("{0:x2}", Message.chksum);
26
            TB_rx5.Text = string.Format("{0:x2}", Message.ende);
27
        }
ich bekomme immer folgende Fehlermeldung:

Ungültiger threadübergreifender Vorgang: Der Zugriff auf das 
Steuerelement feld1 erfolgte von einem anderen Thread als dem Thread, 
für den es erstellt wurde.

und das mit dem Control.Invoke  krieg ich nicht hin!
Vielen Dank für Eure Hilfe

Pier
Gast #1099445
Lesenswert?

Windows Forms Controls dürfen nur aus dem Thread verändert werden, 
welcher das Control erzeugt hat. In deinem Fall dem Main/GUI - Thread. 
Sagt ja auch schon die Fehlermeldung...
1
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) {
2
  ...
3
  SetText("Foo Bar");
4
}
5

6
private delegate void MethInvDel(string text);
7

8
private void SetText(string text) {
9
  if (TB_rx1.InvokeRequired) {
10
    TB_rx1.Invoke(new MethInvDel(SetText), text);
11
  } else {
12
    TB_rx1.Text = text;
13
  }
14
}
Gast #1099999
Lesenswert?

Du könntest das ganze auch in eine anonyme Methode direkt in den 
DataReceived-Event packen. Du kannst dir auch im Prinzip den 
InvokeRequired-Block sparen. Das macht die Sache zwar kürzer, aber nicht 
unbedingt leserlicher.
Gast #3223328
Lesenswert?

>  if (serialPort1.Read(array, 0, 6) == 6)

wird aber NIE sauber funktionieren. Es kann passieren das erst 1 zeichen 
und beim nächsten Event noch mal 5 zeichen kommen. Oder sogar das alle 
Zeichen einzeln kommen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren