【问题标题】:Calling UI-thread from another thread C#从另一个线程 C# 调用 UI 线程
【发布时间】:2019-07-11 02:18:30
【问题描述】:

我正在创建一个聊天应用程序,多个用户可以在其中输入他们的消息并通过 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 函数是负责在 ui 线程或函数调用者上执行此操作,在本例中为 ReceiveData(),实现它的最佳和最现代的方法是什么?

提前谢谢你!

【问题讨论】:

  • 你在 StackOverflow 中有很多例子吗,比如this
  • 诸如“什么是[做某事]最好和最现代的方式”之类的问题在这里无法回答。提供的任何答案都将在五分钟后过时。
  • @nassiel:不就是Control.Invoke()吗?
  • @nassiel 我的老师说这已经过时了,我们不允许使用它

标签: c# multithreading tcp async-await


【解决方案1】:

你的老师真的你这些“现代方法”吗?!

告诉他或她回归基础并没有错:

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!"

让您的老师受益匪浅,您还没有与我们分享此应用程序的任何要求吗?

【讨论】:

    猜你喜欢
    • 2012-08-13
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    相关资源
    最近更新 更多