Вызов UI-потока из другого потока C # - PullRequest
0 голосов
/ 17 февраля 2019

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

У меня есть следующий код для получения сообщений:

private void ReceiveData()
    {
        Task.Run(() =>
        {
            int bufferSize = 1024;
            string message = "";

            byte[] buffer = new byte[bufferSize];
            _NetworkStream = _TcpClient.GetStream();
            AddMessage("Connected!");

            while (true)
            {
                int readBytes = _NetworkStream.Read(buffer, 0, bufferSize);
                message = Encoding.ASCII.GetString(buffer, 0, readBytes);
                Console.WriteLine("I received a message: " + message);

                if (message.Equals("bye"))
                {
                    break;
                }

                AddMessage(message);
            }

            buffer = Encoding.ASCII.GetBytes("bye");
            _NetworkStream.Write(buffer, 0, buffer.Length);

            _NetworkStream.Close();
            _TcpClient.Close();

            AddMessage("Connection closed!");
        });
    }

Теперь, когда я вызываю AddMessage (который я вызываю из другого потока, то есть из другого контекста), мое приложение вылетает.Что вполне логично, учитывая мой код AddMessage:

private void AddMessage(string message)
    {
        this.ListBox_Messages.Items.Add(message);
    }

Мой вопрос заключается в том, является ли функция addmessage ответственной за выполнение этого в потоке пользовательского интерфейса или в функции вызывающей стороны, в данном случае ReceiveData () и что будетлучший и самый современный способ его реализации?

Заранее спасибо!

1 Ответ

0 голосов
/ 17 февраля 2019

Действительно ли ваш учитель УЧИТ вам какой-либо из этих "современных методов"?!

Скажите ему или ей, что нет ничего плохого в возвращении к основам:

private void AddMessage(string message)
{
    if (this.ListBox_Messages.InvokeRequired)
    {
        this.ListBox_Messages.Invoke((MethodInvoker)delegate {
            this.ListBox_Messages.Items.Add(message);
        });
    }
    else
    {
        this.ListBox_Messages.Items.Add(message);
    }          
}

Это просто, и это просто работает.

Как учитель информатики, я ненавижу видеть подобные вопросы.Заставляет меня задуматься, что делают учителя.

Teacher: "You must use this magical stuff that I haven't taught you yet!"

Если ваш учитель пользуется сомнением, существуют ли какие-либо требования к этому приложению, которыми вы не поделились с нами?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...