无法访问已处置对象'RichTextBox'

时间:2013-08-08 20:50:15

标签: c# visual-studio exception serial-port richtextbox

我使用c#在Microsoft Visual Studios 2010中开发的程序产生了以下错误:https://dl.dropboxusercontent.com/u/19853155/code%20error%2001.jpg

我有点将这个问题分离到这段代码:

if (gui.rawLogLSM.InvokeRequired)
{
    gui.rawLogLSM.Invoke(new MethodInvoker(delegate
    {
        gui.rawLogLSM.AppendText(t.ToString()); 
        gui.rawLogLSM.ScrollToCaret();
    }));
}
else
{
    gui.rawLogLSM.AppendText(t.ToString());
    gui.rawLogLSM.ScrollToCaret();
}

基本上在这段代码中,我正在从串口读取原始数据,并逐字节地将其打印到文本框中。 (我无法一次读取整个缓冲区,因为这会使我们为项目做的事情无效。)

我不完全确定这个错误是如何实际产生的或在什么条件下产生的。当一个同事在我缺席的情况下使用该应用程序时,该错误才会出现,并且我无法重新创建错误。

来自异常的信息的错误以消息框的形式出现,因为我在更大的代码块周围进行了try / catch,其中上面的代码是分开的。

所以我的问题主要是,如何解决这个错误,或者我应该做些什么来强制显示错误?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

可能是调用是在另一个线程上,并且在尝试调用文本框时抛出异常,而另一个线程已经放置了文本框(可能在表单上关闭?)?如果这是因为文本框放在不同的线程上,一个解决方案是使用try / catch在调用中包围AppendText和ScrollToCaret并吞下该特定错误。

答案 1 :(得分:1)

错误本身非常简单:在访问它之前,您的富文本框正在处理中。不幸的是,这些可能非常难以追踪,特别是如果你无法重现它。

进行健全性检查并确保在调用Append()的代码之前确实创建了RTB,但是我的直觉告诉我,如果不是,那么你会得到不断的错误。

对我而言,第一步是可靠地重现它。使用你的同事的机器,让他们在弹出错误时展示他们正在做的事情,确保框架和应用程序版本相同等等。

一旦你可以重现它,你将必须找到对象被放置的位置。您可以通过右键单击对dispose的调用并选择“显示所有引用”来手动执行此操作。在每个上设置断点,或使用其他一些监控方案(如日志,可用于在非开发机器上观看程序)。请记住,System.Diagnostics.StackTrace类对于查看名为Dispose的内容非常有用。

还有tools that monitor memory usage and disposal可以帮助你。

我还建议打开调试模式并为您的同事提供启用调试的可执行文件和符号文件(pdb),因为这可能有助于跟踪问题。

要检查的其他事项包括竞争条件,同时/跨线程访问,CLR可能吞下的其他线程中的异常,以后稍后会捏造代码,并确保在关闭之前结束所有线程形成。如果你不这样做,可能会发生奇怪的事情。充其量,您的程序将继续挂起内存,除了任务管理器之外的所有人都看不见。更糟糕的是,当最终失败时,你可以“突然”弹出随机错误对话框。在你的情况下,它可能会立即失败。