当非UI线程尝试将其输出附加到主线程中的RichTextBox
UI控件时,会发生难以跟踪的异常。
此异常在随机时间发生,主要是当线程快速连续调用此方法时。它甚至只出现在2个非UI线程中。
以下是AppendLog方法的代码。它位于主UI的Form类中。我生成2个线程并将此方法作为Action<string> logDelegate
我甚至已经安装了syncobject。
public void AppendLog(string message)
{
try
{
if (this.InvokeRequired)
{
this.Invoke(new Action<string>(this.AppendLog), message);
}
else
{
lock (_logSyncRoot)
{
if (rtbLog.TextLength > 100000)
rtbLog.ResetText();
rtbLog.AppendText(message);
rtbLog.ScrollToCaret();
}
}
}
catch (Exception ex)
{
Logger.LogException(ex);
}
}
System.AccessViolationException:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
at System.Windows.Forms.Control.DefWndProc(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.TextBoxBase.WndProc(Message& m)
at System.Windows.Forms.RichTextBox.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.SendMessage(HandleRef hWnd, Int32 msg, Int32 wParam, Object& editOle)
at System.Windows.Forms.TextBoxBase.ScrollToCaret()
at MyApp.UI.OfflineAnalyzer.AppendLog(String message) in D:\MyApp\Code\Charting\OfflineAnalyzer.cs:line 339
答案 0 :(得分:1)
在这种情况下最简单的情况是,如果您有一个消息列表,请维护Queue<string> queue;
。随意将值添加到队列中。在主表单线程中,使用计时器组件并锁定队列,同时拉出值,例如lock (queue) {rtbLog.AppendText(queue.Dequeue());}
。