1

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

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

从后台线程中,我定期在表单上调用更新方法,该方法执行类似于以下操作:

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

实际上,我在 try/catch 中确实有内部invoke和外部(是的,我知道这很可怕!)而且我正在做一些额外的事情,比如将插入符号放在末尾并滚动到它。我也在使用StringBuilder,但这完全不是重点:

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

这个文本框没有什么特别的事情发生。没有竞争条件(首先是因为我有一个锁),而且还因为我的代码中根本没有任何东西会尝试在其他东西尝试写入文本框的同时尝试写入文本框。

知道为什么会发生这种情况吗?对不起,我不知道我可以在这里放什么其他信息,因为我什至不确定为什么会发生这种情况。

4

1 回答 1

0

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

于 2013-03-18T04:08:55.660 回答