RichTextBox语法突出显示主线程最佳实践?

时间:2011-08-04 14:06:04

标签: c# winforms .net-4.0 richtextbox syntax-highlighting

运行语法高亮显示文本框中文本的函数的最佳方法是(左边是=红色,右边是=蓝色)。我问,因为我在CommandTask线程中对数据进行了回溯,然后在FinishCommand中进行了突出显示(在UI线程中)并且这似乎有效,但是当它突然消失突出显示时会使UI死锁一段时间。

所以,然后我尝试将突出显示代码放在specalized RichTextBox Invoke函数中(因此线程安全)并在线程中移动函数调用。这也有效,但出于某种原因,它的速度相差4-8秒;这对我没有意义,因为它的代码完全相同。

最后,我尝试在线程中创建一个临时RichTextBox,将生成的文本粘贴到它并突出显示。然后,所有的Invoke函数都是沿着RTF传递给真正的RichTextBox,但是在这种情况下由于某种原因,RTF不是很正确,它的颜色每次移动2:Ex:R = red,B = Blue ,X =黑色字符

第1行。RRRRXBBBB(正确)

第2行.XXRRRRBBB(着色向右移2)

第3行.XXXXRRRRX(向右移动4,依此类推)

所以,我的首要问题是哪种方法最好,为什么线程完全相同的代码更慢,如果方法3是最好的,那就是那种奇怪的色彩转换。谢谢!

2 个答案:

答案 0 :(得分:3)

它较慢,因为调用很昂贵。它需要两个线程上下文切换,UI线程必须是空闲的。为每一个突出显示更改执行此操作,您将严重陷入困境。使用BeginInvoke()可以解决这个问题,但是现在你将陷入UI线程,因此它没有响应。换句话说,你无法用这种策略获胜。

不确定帮助程序RTB出了什么问题。每条线路都是两个,闻起来像一个简单的bug。就像不考虑行末的回车+换行一样。

更快的方法是告诉RTB在忙于突出显示文本时不自行更新。差别很大。这不是内置的,但你可以easily add it。考虑减少损失,RTB不是一个非常好的编辑。请看ScintillaNET

答案 1 :(得分:0)

一种典型的方法是实现某种RTF生成器,它使用快速字符串操作(StringBuilder,StringWriter等)构建兼容RTF的字符串,然后用您自己的RTF代码替换RichTextBox控件的RTF代码:

string rtf = /* Generate RTF code based on original text */
richTextBox.Rtf = rtf; // Replace text box's RTF code

您可以在此处找到有关RTF格式的文档:

http://msdn.microsoft.com/en-us/library/aa140277%28v=office.10%29.aspx

你基本上需要生成:

  • RTF标题
  • 字体表
  • 颜色表
  • 字符文字

您可以通过使用Wordpad通过反复试验来创建一个简单的文档,使用您想要的语法突出显示,以RTF格式保存文档,然后在记事本或类似应用程序中打开它然后分析生成的RTF

此方法的好处是您可以在单独的线程中生成RTF代码,然后在生成代码时仅更新一次用户界面。