当RichTextBox充满大量数据时,UI挂起

时间:2019-11-13 11:17:12

标签: c# wpf richtextbox

我正在开发一个GUI,用户可以在其中连接到服务器并读取数据。数据需要显示在GUI上。为此,我使用TabControl,其ContentTemplate设置为RichTextBox。

当用户单击“连接”按钮时,UI将连接到TCP服务器。在这里,我产生了一个新线程,该线程从服务器读取数据。但是,当将大量数据泵送到RTB之后,UI变得无响应。我无法在屏幕内移动应用。

为什么我的UI无法响应。我可以删除实时出价工具中的旧数据,而动态添加新数据吗? 有什么方法可以动态删除较旧的数据(新数据将在下面添加),以免RTB加载过多,并且UI应能正常工作。此外,该应用程序在任务管理器中的进程下利用多达80个CPU 我是C#和WPF的新手。任何线索将不胜感激。

private void BtnConnect_Click(object sender, RoutedEventArgs e)
        {
            //connect
            TCPClientClass tcpClient = TCPConnHandler.ConnectToService(tbIPAddress.Text);
            if (tcpClient != null)
            {
                MessageBox.Show("Connected to " + tbIPAddress.Text);
                //open new tab
                var item = MainWindowVMObj.AddTabItem();

                Thread thTabControl = new Thread(() =>
                {
                    while (tcpClient.Connected)
                    {
                        String str = tcpClient.GetDataFromServer();
                        if (!String.IsNullOrEmpty(str))
                            tabControl1.Dispatcher.BeginInvoke((Action)(() => item.Content += str));
                        Thread.Sleep(200);
                    }
                    //item.Dispatcher.BeginInvoke
                });

                thTabControl.Start();
            }
        }

1 个答案:

答案 0 :(得分:0)

这里的问题是您正在执行很多字符串连接(item.Content += str),并且会对性能产生巨大的影响(也导致CPU和RAM的使用)。

请尽量将内容保留在框中,例如仅保留最后十条消息。或者代替串联,将RichTextBox替换为基于列表的控件。然后只将最后几条消息保留在列表中。