语法突出显示出主线程的最佳实践
本文关键字:最佳 显示 语法 线程 | 更新日期: 2023-09-27 18:04:35
运行一个用语法高亮显示文本框中的文本的函数(左边的=是红色的,右边的=是蓝色的)的最佳方式是什么?我问是因为我在CommandTask线程中进行了数据检索,然后在FinishCommand(在UI线程中)中进行了高亮显示,这似乎有效,但会死锁UI一段时间,它会高亮显示。
所以,然后我尝试将高亮代码放在一个专门的RichTextBox Invoke函数(因此线程安全)中,并在线程中移动函数调用。这也是有效的,但由于某些原因总是慢4-8秒;这对我来说没有意义,因为它是完全相同的代码。
最后,我尝试在线程中创建一个临时的RichTextBox,将结果文本粘贴到它并突出显示。然后,所有的调用函数所做的是沿着RTF传递到真正的RichTextBox,但在这种情况下,由于某种原因,RTF不太正确,它的颜色每次移动2 Ex: R=红色,B=蓝色,X=黑色字符
1号线。RRRRXBBBB(正确的)
第2行。XXRRRRBBB(颜色向右移动了2个)
第3行。XXXXRRRRX(右移4,以此类推)
所以,我的首要问题是哪种方法是最好的,为什么线程相同的代码更慢,如果方法3是最好的,那奇怪的颜色变化是怎么回事?谢谢!
由于调用成本较高,所以它较慢。它需要两个线程上下文切换,并且UI线程必须是空闲的。对每一个高亮更改都这样做,你会严重地使线程陷入困境。使用BeginInvoke()可以解决这个问题,但是现在你会使UI线程陷入困境,所以它没有响应。换句话说,你用那个策略是赢不了的。
不确定helper RTB出了什么问题。每行差两个,闻起来像个小bug。比如不考虑行尾的回车+换行。
加快速度的一个更好的方法是告诉RTB在您忙于高亮显示文本时不要自行更新。差别很大。这不是内置的,但你可以很容易地添加它。考虑减少你的损失,RTB不是一个很好的编辑器。看ScintillaNET
一种典型的方法是实现某种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头 <
- 字体表/gh>
- 颜色表 <
- 字符文本/gh>
您可以通过使用写字板的反复试验来实现这一点,创建一个具有所需语法突出显示的简单文档,将文档保存为RTF格式,然后在记事本或类似应用程序中打开它,然后分析生成的RTF。
这个方法的好处是你可以在一个单独的线程中生成RTF代码,然后在生成代码时只更新一次用户界面。