AccessViolation在RichTextBox.ScrollToCaret发生(Access

2019-09-17 00:05发布

当非UI线程试图追加其输出到难以跟踪异常是发生RichTextBox UI控制在主线程。

此异常发生在随机时间,大多是当线程呼吁临门此方法。 它发生,即使在只有2非UI线程。

下面是AppendLog方法的代码。 它是在主界面的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

Answer 1:

在类似这样的情况下,最简单的情况是保持Queue<string> queue; 如果你有,例如邮件的列表。 值,以将添加到队列中。 在主螺纹形式,使用一个计时器组件和锁定队列在拉出值例如lock (queue) {rtbLog.AppendText(queue.Dequeue());}



文章来源: AccessViolation occurs in RichTextBox.ScrollToCaret