1

我在 Microsoft Visual Studios 2010 中使用 c# 开发的程序产生了以下错误: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();
}

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

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

来自异常的信息的错误以消息框的形式出现,因为我在更大的代码块周围进行了尝试/捕获,其中上述代码是其中的一部分。

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

谢谢您的帮助!

4

2 回答 2

1

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

于 2013-08-08T21:25:50.143 回答
1

错误本身非常简单:您的富文本框在您访问它之前就被处理掉了。不幸的是,追踪这些可能非常令人讨厌,特别是如果您无法重现它。

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

对我来说,第一步是可靠地复制它。使用你同事的机器,让他们演示当错误弹出时他们在做什么,确保框架和应用程序版本相同,等等。

一旦可以复制它,您就必须找到该对象的处置位置。您可以通过右键单击对 dispose 的调用并选择“显示所有引用”来手动执行此操作。在每个上面设置断点,或者使用其他一些监视方案(如日志,可用于监视非开发机器上的程序)。请记住,System.Diagnostics.StackTrace该类对于查看所谓的 Dispose 很有用。

还有一些监控内存使用和处置的工具可以帮助您。

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

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

于 2013-08-08T21:34:50.753 回答