Возникли проблемы с изменением TextBox из другого класса - PullRequest
0 голосов
/ 12 октября 2019

У меня проблема с тем, что я хочу иметь возможность изменять текстовое поле из другого класса.

Я пробовал искать и тестировать решения, но ни одно из них не помогло. (Вызов для примера ..)

Код из класса cThread:

        class cThread
        {

            public bool closed = false;
            private TcpClient client;
            private StreamReader ins;
            private StreamWriter ots;
            Form1 meow = new Form1();

            public cThread(TcpClient client, StreamReader ins, StreamWriter ots)
            {
                this.client = client;
                this.ins = ins;
                this.ots = ots;
            }

            public void run()
            {
                try
                {
                    string responseLine;

                    responseLine = meow.bunifuCustomTextbox2.Text;

                    while ((responseLine = ins.ReadLine()) != null)
                    {

                        Console.WriteLine(responseLine);

                        meow.bunifuCustomTextbox3.Text = responseLine + " test";

                        if (responseLine.IndexOf("*** Adios") != -1)
                        {
                            break;
                        }
                    }
                    closed = true;
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.ToString());
                }
                Environment.Exit(0);
            }
        }

Это приводит к ошибке: Cross-Thread operation not valid: accessed from a thread other than the thread it was created on.

Я также пробовал это решение:

            public void run()
            {
                try
                {
                    string responseLine;

                    meow.bunifuCustomTextbox2.Invoke(new MethodInvoker(delegate { responseLine = meow.bunifuCustomTextbox2.Text; }));

                    while ((responseLine = ins.ReadLine()) != null)
                    {

                        Console.WriteLine(responseLine);

                        meow.bunifuCustomTextbox3.Invoke(new MethodInvoker(delegate { meow.bunifuCustomTextbox3.Text = meow.bunifuCustomTextbox2.Text; }));

                        meow.bunifuCustomTextbox3.Text = responseLine + " test";

                        if (responseLine.IndexOf("*** Adios") != -1)
                        {
                            break;
                        }
                    }
                    closed = true;
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.ToString());
                }
                Environment.Exit(0);
            }
        }

Это тоже не сработало. Та же ошибка.

Я ожидаю, что когда пользователь введет сообщение в bunifuCustomTextbox2, оно будет установлено на responseLine, которое я хочу оживленно обновить с помощью bunifuCustomTextbox3.

Поскольку это будет многопользовательский чат, и я конвертирую этот код из консольного приложения в winforms ..

извините, если я тупой: (* ​​1020 *

1 Ответ

1 голос
/ 12 октября 2019

Когда вы обращаетесь к ресурсу пользовательского интерфейса из другого потока, вы должны иметь дескриптор потока Dispatcher, который:

Dispatcher.Invoke(() => { /* UI changes */ });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...