Entwickler-Ecke

WinForms - thread Invoke


doubleII - Mi 11.01.17 13:03
Titel: thread Invoke
Hallo zusammen,

ich habe folgendes Problem:
Ich erstelle eine Server-Client Verbindung.
WinForm Server
WinForm Client

ich möchte eine checkBox, die auf WinForm1 habe, nicht nur direkt aus dem WinForm Server
anhaken sondern von der WinForm Client auch steuern. Ich habe folgenden Code:

Es wird eine Verbindung erstellt und der Server wartet auf den Client.

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
 
 private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            ReceivedDate();
        }

private void ReceiveData()
        {           
            if (client.Connected)
                while (client.Connected)
                {
                    try
                    {
                        receive = streamReader.ReadLine();
                        textBox1_5.Invoke(new MethodInvoker(delegate()
                            {
                                textBox1_5.AppendText(receive + Environment.NewLine);
                            }));
                        GetCommand(receive);
                        receive = "";
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                        throw;
                    }                   
                }
            else
            {
                textBox1_5.Text = "Connect failed!";
            }

  private void GetCommand(string receive)
        {
            if (receive == "grab")
            {
                checkBoxGrab.CheckState = CheckState.Checked;
            }
            else if (receive == "stop")
            {
                checkBoxGrab.CheckState = CheckState.Unchecked;
            }
        }

  private void checkBoxGrab_CheckedChanged(object sender, EventArgs e)
        {
            Grab();
        }


Wenn ich das Befehl grab von Client aufrufe bekomme ich folgende Fehlermeldung:
Zitat:
der zugriff auf das steuerelement erfolgte von einem anderen thread


Ich habe ins I-Net recherchiert aber komme ich noch nicht klar, wie man das Problem lösen kann. :(


Christian S. - Mi 11.01.17 13:19

user profile icondoubleII hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe ins I-Net recherchiert aber komme ich noch nicht klar, wie man das Problem lösen kann. :(

Dann frage ich mich, wie Dein bisheriger Code zustande gekommen ist, die Lösung steht da schon drin: die Invoke-Methode benutzen.


doubleII - Mi 11.01.17 16:07

Abgeschrieben :).

Danke Cristian S.