C# 如何在Windows窗体中创建非阻塞控件?
在我的表单上,我有一个RichTextBox,它将不断用文本更新(聊天应用程序)。我还有一个文本框,用户在其中键入他们想要发送的文本 无论如何,当RichTextBox更新时,它会阻止UI线程,这意味着在它完成更新之前,我无法在TextBox中键入(或使用任何按钮)。同样,当文本框处理按键时,RTB被阻止(如果用户按下/滥发按键,这可能是一个问题) 建议用什么方法来处理这个问题 以下是相关代码(为了简洁起见,按代码流的顺序缩短):C# 如何在Windows窗体中创建非阻塞控件?,c#,winforms,controls,C#,Winforms,Controls,在我的表单上,我有一个RichTextBox,它将不断用文本更新(聊天应用程序)。我还有一个文本框,用户在其中键入他们想要发送的文本 无论如何,当RichTextBox更新时,它会阻止UI线程,这意味着在它完成更新之前,我无法在TextBox中键入(或使用任何按钮)。同样,当文本框处理按键时,RTB被阻止(如果用户按下/滥发按键,这可能是一个问题) 建议用什么方法来处理这个问题 以下是相关代码(为了简洁起见,按代码流的顺序缩短): 防止UI冻结的唯一方法是永远不要在UI线程上做大量工作。我认为问
防止UI冻结的唯一方法是永远不要在UI线程上做大量工作。我认为问题在于:
richTextBox1.Text += line + "\n"
乍一看,这似乎是一个小工作量:看起来您只要求RichTextBox
附加一行。但是,如果您这样使用,RichTexBox
看不到“追加一行”和“刷新所有内容”之间的区别,因为上面的代码相当于:
richTextBox1.Text = richtTextBox1.Text + line + "\n"
它每次都必须处理整个字符串。这就是为什么您不应该设置
Text
属性,而应该使用。您可以使用web浏览器控件来代替RichTextBox。我相信大部分逻辑都在别处运行。哇,我从来不知道有什么不同。然而,当我更改行时,文本更新变得更快、更快速,使任何UI冻结都变得不明显。
richTextBox1.Text = richtTextBox1.Text + line + "\n"