C# 保存/加载富文本速度问题

Posted

技术标签:

【中文标题】C# 保存/加载富文本速度问题【英文标题】:C# Saving/Loading richtext speed issue 【发布时间】:2009-04-18 04:08:29 【问题描述】:

我目前正在尝试解决涉及加载和保存富文本的速度问题。这是详细信息。在我的应用程序中,我有一个 Question 类,它需要能够存储两个富文本。目前,这两个富文本作为 TextRanges 存储在 Question 类中。就保存/加载而言,我使用的是 TextRange.Load(Stream, DataFormats) 和 TextRange.Save(Stream, DataFormats)。一切正常...

我的问题是我需要从文件中保存/加载 1000 多个这样的问题。当我这样做时,保存/加载包含这些问题的文件需要 20~ 秒。最重要的是,我希望能够一次加载其中的几个文件……这可能会让用户等待几分钟。我确定我的问题现在很清楚了。

所以我开始调查为什么保存/加载文件需要这么长时间,并且从分析器中我发现保存/加载文件所花费的时间中有 80% 是在 TextRange.Load 和 TextRange.Save 方法中。

所以我的问题是...是否有人对加快我的文件保存/加载有任何建议或指示?

我试图想另一种方法将富文本存储在 Question 类和文件中。我很快就没有想法了,但我想在我承认之前来到这里。任何帮助是极大的赞赏。如果我需要澄清任何事情,也请告诉我。谢谢!

【问题讨论】:

【参考方案1】:

每次调用 Load 和 Save 有多少开销,对于大范围调用 Load 一次与对于小范围调用多次有什么优势?加载 +1000 个问题时,您调用 Load 多少次?每个调用 Load 的行为是否都会在某处更新 RichTextBox 或 Flow Document?如果不是,一旦加载了 TextRanges,您将如何处理它们?

我注意到这个相关的thread 并认为我会提供一个建议:如果您将字节数组(或内存流)保存在 Question 类而不是 TextRange 中,并且仅在您实际需要加载您的RichTextBox 中的数据(当问题窗口打开时)?

【讨论】:

既然您提到它,TextRange.Save 和 Load 方法中的开销相当可观。我实际上为每个问题调用了两次 Load。因此,对于 1000 个问题,它被称为 2000 次。有一个 FlowDocument 用于加载富文本,但根据分析器并没有占用太多 CPU。我允许用户打开这些问题,即当打开一个带有 RichTextBoxes 的窗口时,这些 TextRanges 会填满。 我想我可以尝试将 TextRanges 合并为一个大的用于保存和加载,然后解析它。我敢肯定,它至少会加快一些速度。谢谢你的主意。 ^^ 好主意!我认为打开几千个流并不好,也不想每次我想阅读它们时都确保它们在开头。因此,我将 TextRanges 更改为 byte[]。我不得不改变一堆东西,但是一旦我完成了,我就运行它,我的代码运行速度快了大约 10 倍,哈哈,但加载文件仍然需要一段时间。使用分析器,我能够加快速度。现在它在大约半秒内加载一个文件!谢谢! :D【参考方案2】:

您可以查看threading。这样您就可以在不锁定 UI 的情况下加载您的问题。加载前 100 个,当它们用完时,再加载 100 个左右。

【讨论】:

我之前一直在玩这个想法。我不会这样做,因为我需要为用户加载整个文件才能对问题做任何事情;但是,我可以使用线程,以便用户可以处理已经加载的文件。

以上是关于C# 保存/加载富文本速度问题的主要内容,如果未能解决你的问题,请参考以下文章

打开保存的文件,其中包含对富文本所做的更改

Ant design——message防抖优化——富文本的使用——富文本数据的收集——上传图片保存本地

C#如何实现数据库连接信息保存在文本中,如何读取该文本信息进行连接数据库的操作。 连接数据库的信息?

求救,C#富文本框显示异常!

UEditor富文本编辑器,请问如何保存编辑好的内容到html文件?

如何在 C# 的富文本框中将文本添加到用户光标的位置?