我一直在用RichTextBox.ScrollToCaret遇到一個有點令人沮喪的障礙。我有將消息輸出到RichTextBox的代碼。當每條消息發送到表單時,它將被拆分成多行並進行格式化,然後將每行連接起來並將結果發送到RichTextBox.Append。然後,滾動到下面的兩個電話框的底部:由XNA遊戲發佈的表單中的RichTextBox.ScrollToCaret出現AccessViolationException
outputBox.Select(outputBox.Text.Length, 0);
outputBox.ScrollToCaret();
當打印一條消息時,它很好。當打印一小撮消息時,沒有問題。當連續快速打印一串消息時,它會隨機發送一個消息(在它發生之前打印多少條消息),並拋出一個AccessViolationException異常(「試圖讀取或寫入受保護的內存,這通常表示其他內存已損壞。」,全部詳細信息here)下一次在該框上添加名爲的添加下一條消息。這個只有發生在快速連續執行時,並且只有每次使用RichTextBox.ScrollToCaret時。下面的代碼,我就回落正常工作:
outputBox.Focus();
outputBox.Select(outputBox.Text.Length, 0);
我發現過,即使我捕捉到的異常,並把它扔了,程序會掛在附加的下一次調用。所以,我認爲這是RichTextBox中實際代碼的問題。有人有主意嗎?
如果有人需要它,我可以發佈更多我的代碼,但情況確實非常基礎。需要注意的是,沒有多線程(除了固有的UI線程),所以發送消息的對象和接收它們的表單在同一個線程中。此外,這是在.NET 4.0下。
我發現這個問題解決了這個問題,但只提供了一個解決方法,沒有真正的解釋:AccessViolation occurs in RichTextBox.ScrollToCaret。不幸的是,我的線程經驗並不是我想要的地方,所以我無法讓他們的解決方案正常工作,但幸運的是,我上面發佈的工作很好。
更新1
因此,它看起來經過一些像它的測試有事情做與XNA,所以它可能是我如何與線程工作的誤解。我一直無法在純WinForms應用程序中重現錯誤,但可以通過簡單的XNA遊戲輕鬆完成。我已經在這裏拉鍊讓你看。抱歉的錯誤。 https://dl.dropbox.com/u/16985121/StackOverFlowExamples.zip
是調用不同的線程比.Append調用。選擇()調用? – cppanda
不,我寫的所有內容都發生在主線程上。所以就是這個和UI線程。 –
public delegate void WriteLogEntryDelegate(string log_entry); 空隙WriteLogEntryCB(串log_entry) { 如果(richTextBox1.InvokeRequired == TRUE){ 變種 = d新WriteLogEntryDelegate(WriteLogEntryCB);這個.Invoke(d,log_entry); } else { richTextBox1.AppendText(log_entry +「\ r \ n」); this.richTextBox1.SelectionStart = this.richTextBox1.Text.Length; this.richTextBox1.ScrollToCaret(); } } –