2013-03-18 64 views
1

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

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

从后台线程,我定期调用,它类似于东西下我的窗体上的更新方法:

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

我做一个真正有invoke的内侧和外侧尝试/捕捉(是的,我知道这太可怕了!),我正在做一些额外的事情,比如把脱字符放到最后并滚动到它。我还使用StringBuilder但这是所有跑题了:

很少,但不可避免的是,在调试时,我的IDE中多数民众赞成更新文本框代码检测AccessViolationException地方。有时候会更新文本,有时会在选择的位上进行更新,有时位于滚动到插入的位置。如果我按F5继续,我通常不会在一段时间内看到问题,应用程序会像以前一样继续。

这个文本框没有什么奇异的事情发生。没有竞争条件(首先是因为我有一个锁),但也因为我的代码中没有任何内容会尝试写入文本框,而与其他内容一起尝试写入文本框。

任何想法为什么会发生这种情况?我很抱歉,我不知道我可以在这里提供哪些其他信息,因为我甚至不知道为什么这首先发生。

回答

0

不知道你的其他代码在做什么,但我认为问题是锁定(richTextBox)。如果GUI线程正在处理RichTextBox,锁定将不起作用或者如果您在其他某个线程中访问此RichTextBox。

+0

不,这是不正确的。首先,我最近添加了锁,并且在我添加之前和之后发生访问冲突。另外,没有“其他线程”,因为我已经在GUI线程上调用了更新。无论如何,锁定永远不会导致你描述的问题。 – Ozzah 2013-03-18 04:16:29