Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Windows窗体中创建非阻塞控件?_C#_Winforms_Controls - Fatal编程技术网

C# 如何在Windows窗体中创建非阻塞控件?

C# 如何在Windows窗体中创建非阻塞控件?,c#,winforms,controls,C#,Winforms,Controls,在我的表单上,我有一个RichTextBox,它将不断用文本更新(聊天应用程序)。我还有一个文本框,用户在其中键入他们想要发送的文本 无论如何,当RichTextBox更新时,它会阻止UI线程,这意味着在它完成更新之前,我无法在TextBox中键入(或使用任何按钮)。同样,当文本框处理按键时,RTB被阻止(如果用户按下/滥发按键,这可能是一个问题) 建议用什么方法来处理这个问题 以下是相关代码(为了简洁起见,按代码流的顺序缩短): 防止UI冻结的唯一方法是永远不要在UI线程上做大量工作。我认为问

在我的表单上,我有一个RichTextBox,它将不断用文本更新(聊天应用程序)。我还有一个文本框,用户在其中键入他们想要发送的文本

无论如何,当RichTextBox更新时,它会阻止UI线程,这意味着在它完成更新之前,我无法在TextBox中键入(或使用任何按钮)。同样,当文本框处理按键时,RTB被阻止(如果用户按下/滥发按键,这可能是一个问题)

建议用什么方法来处理这个问题

以下是相关代码(为了简洁起见,按代码流的顺序缩短):


防止UI冻结的唯一方法是永远不要在UI线程上做大量工作。我认为问题在于:

richTextBox1.Text += line + "\n"
乍一看,这似乎是一个小工作量:看起来您只要求
RichTextBox
附加一行。但是,如果您这样使用,
RichTexBox
看不到“追加一行”和“刷新所有内容”之间的区别,因为上面的代码相当于:

richTextBox1.Text = richtTextBox1.Text + line + "\n"

它每次都必须处理整个字符串。这就是为什么您不应该设置
Text
属性,而应该使用。

您可以使用web浏览器控件来代替RichTextBox。我相信大部分逻辑都在别处运行。哇,我从来不知道有什么不同。然而,当我更改行时,文本更新变得更快、更快速,使任何UI冻结都变得不明显。
richTextBox1.Text = richtTextBox1.Text + line + "\n"