与RichTextBox交互时的AccessViolationException

时间:2013-03-18 03:14:57

标签: c# winforms .net-4.0 access-violation

我知道.Net 2.0与LCG存在错误,当使用某些AccessViolationException和类似对象时会生成IEnumerable<>;并且有一个修补程序。

我使用在Windows 7 x64上运行的WinForms在.Net 4.0中有一个项目。我有一个非常简单的表单 - 只有一个表单和RichTextBox停靠以占用整个客户端大小。

在后台线程中,我会定期在我的表单上调用一个更新方法,该方法执行类似的操作:

public static void Log(string text)
{
  Invoke((MethodInvoker)(() => {
    lock(richTextBox) {
      richTextBox.Text += text;
    }   
  }));
}

我确实同时拥有invoke的内部和try / catch的外部(是的,我知道这太可怕了!)而且我正在做一些额外的事情,比如将插入符号放到最后并滚动到它。我也在使用StringBuilder,但这就是重点:

很少,但不可避免地,在调试时,我的IDE会在代码中的某个地方检测到AccessViolationException正在更新文本框。它有时会在更新文本的位置,有时会在选择的位置,而有时会滚动到插入符号。如果我按F5继续,我通常不会看到问题一段时间,应用程序继续像以前一样。

这个文本框没有任何花哨的东西。没有竞争条件(首先是因为我有一个锁),但也因为我的代码中没有任何内容可以尝试和其他人试图同时写入文本框。

知道为什么会这样吗?对不起,我不知道我能在这里提供什么其他信息,因为我甚至不确定为什么会发生这种情况。

1 个答案:

答案 0 :(得分:0)

不确定你的其余代码是做什么的,但我认为问题在于lock(richTextBox)。如果GUI线程正在使用RichTextBox执行某些操作,则锁定将无效或者如果您在其他某个线程中访问此RichTextBox。