2013-03-18 42 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