我遇到了 RichTextBox.ScrollToCaret 有点令人沮丧的障碍。我有将消息打印到 RichTextBox 的代码。当每条消息发送到表单时,它被拆分为多行并格式化,然后将每一行连接起来,并将结果发送到 RichTextBox.Append。然后,进行以下两个调用以滚动到框的底部:
outputBox.Select(outputBox.Text.Length, 0);
outputBox.ScrollToCaret();
打印一条消息时,没问题。打印少量消息时,没有问题。当快速连续打印一堆消息时,它会随机(在它发生之前打印多少条消息)抛出一个 AccessViolationException (“尝试读取或写入受保护的内存。这通常表明其他内存已损坏。”,完整此处详细信息)下次在该框上调用 Append 以添加下一条消息。这只发生在快速连续执行时,并且仅在每次使用 RichTextBox.ScrollToCaret 时发生。我依赖的以下代码可以正常工作:
outputBox.Focus();
outputBox.Select(outputBox.Text.Length, 0);
我还发现,即使我捕获了异常并将其丢弃,程序也会在下次调用 Append 时挂起。所以,我认为这是 RichTextBox 中实际代码的问题。有人有想法么?
如果有人需要,我可以发布更多我的代码,但情况确实非常基本。需要注意的一点是,没有多线程(除了固有的 UI 线程),所以发送消息的对象和接收它们的表单在同一个线程上。此外,这是在 .NET 4.0 下。
我发现this other question解决了这个问题,但只提供了一种解决方法,没有真正的解释:AccessViolation 发生在 RichTextBox.ScrollToCaret 中。不幸的是,我在线程方面的经验不是我想要的,所以我无法让他们的解决方案正常工作,但幸运的是我在上面发布的内容很好。
更新 1
所以它会处理一些测试,就像它与 XNA 有关,所以这可能是我对线程如何工作的误解。我无法在纯 WinForms 应用程序中重现该错误,但通过一个简单的 XNA 游戏轻松完成。我把这两个都压缩了,让你看看。为错误道歉。 https://dl.dropbox.com/u/16985121/StackOverFlowExamples.zip