WPF TextBlock更新

时间:2015-01-05 22:28:37

标签: c# wpf multithreading client server

仅仅出于学术目的,我将以前的代码从Windows窗体改编为WPF,问题是我无法理解调用是如何工作的,希望有人可以在我阅读时给我一个灯光一些教程并解释我可以修改这段代码。

每当有人在send_click上发送消息时,它就会发送到调度到所有连接套接字的服务器。我的问题是,如何调整此代码以使文本块可以更新"?它说已经被另一个线程(主线程)使用了。 这是我的应用程序包含的代码。提前谢谢!

更新#1:这是我第一次尝试使用调度程序调用{​​{3}},但我并不了解这种壁纸背后的原因。

 public Lobby()
    {
        InitializeComponent();
        ctThread = new Thread(getMessage);
        ctThread.Start();
        clientSocket.Connect("127.0.0.1", 8888);
        serverStream = clientSocket.GetStream();
    }

    TcpClient clientSocket = new System.Net.Sockets.TcpClient();
    NetworkStream serverStream = default(NetworkStream);
    string readData = null;
    Thread ctThread;


    private void btnSend_Click(object sender, RoutedEventArgs e)
    {
        byte[] outStream = System.Text.Encoding.ASCII.GetBytes(txtInput.Text);
        serverStream.Write(outStream, 0, outStream.Length);
        serverStream.Flush();
    }

    private void getMessage()
    {
        while (true)
        {
            serverStream = clientSocket.GetStream();
            int buffSize = 0;
            byte[] inStream = new byte[10025];
            buffSize = clientSocket.ReceiveBufferSize;
            serverStream.Read(inStream, 0, buffSize);
            string returndata = System.Text.Encoding.ASCII.GetString(inStream);
            readData = "" + returndata;
            Dispatcher.BeginInvoke(new Action(() =>
                {
                        txtContent.Text = txtContent.Text + Environment.NewLine + " >> " + readData;
                }));
        }
    }          

1 个答案:

答案 0 :(得分:1)

msg在其自己的线程上,因此必须将来自该函数的UI更新编组到UI线程上。您可以使用Dispatcher.BeginInvoke执行此操作:

Dispatcher.BeginInvoke(new Action(() =>
{
    if (txtContent.Text != null)
    {
        txtContent.Text = txtContent.Text + Environment.NewLine + " >> " + readData;
    }
});

请注意,您应该考虑使用绑定而不是直接操作UI。