【问题标题】:WPF TextBlock UpdateWPF 文本块更新
【发布时间】:2015-03-03 13:11:38
【问题描述】:

仅出于学术目的,我将以前的代码从 windows 窗体改编为 WPF,问题是我无法理解调用是如何工作的,希望有人可以在我阅读一些教程并解释时给我一些启发我能做些什么来调整这段代码。

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

更新 #1:这是我第一次尝试使用调度程序调用 http://gyazo.com/42008aacbec2f8494bb7c6c33889d9ad,但我不明白这个 walloftext 背后的原因。

 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;
                }));
        }
    }          

【问题讨论】:

    标签: c# wpf multithreading client server


    【解决方案1】:

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

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

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

    【讨论】:

    • 仍在围绕 mvvm 工作,尽管使用它给了我更好的结果,但现在在我收到 gyazo.com/42008aacbec2f8494bb7c6c33889d9ad 的第一个错误之后,使用休息我确定他没有没有向服务器发送更多数据,他停在 serverStream,我还有 2 个 windowsforms 应用程序要测试,它们之间使用完全相同的代码进行良好的通信(除了调用部分,在 windowsform theres method.invoke 上)。无论如何,感谢您对调用的帮助!
    • 我知道出了什么问题,没关系!感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多