我今天遇到了一个非常奇怪的错误。我在表单上有一个按钮,单击它会导致我的表单上的网格填充数据。如果单击该按钮两次,则会因“对象引用未设置为对象实例而崩溃”。
我最终在Sub的开头放置一个断点来处理该网格的数量,我发现......它不再崩溃了。我点击按钮,在Visual Studio中按'F5',它不会崩溃。我做了这个,至少10次,它是固定的。
然后,我删除了断点,F5'ed,点击按钮,它崩溃了。重新添加断点,允许它工作。
有人可以解释这里发生了什么吗?我正在使用的网格是第三方控件(Infragistics),该应用程序是一个WinForms应用程序。我没有做任何线程 - 我唯一的想法是它是某种'竞争条件'?但即便如此,对我来说也没有意义。
编辑:这是一个VB.Net应用程序/ Visual Studio 2008
答案 0 :(得分:5)
这里可能会有一些异步加载数据。添加断点使异步部分有时间完成。当你点击它太快时,它仍然在等待数据完成加载或其他什么,因此错误。您可能没有实现此目的,但第三方控件可能有。
答案 1 :(得分:4)
这听起来像是一个时间问题&必须在后台进行一些线程 - 可能是在第三方控制中。
你能从异常中得到一个调用堆栈吗?
在发布模式下(或没有断点时),您可以在第一次点击完全处理之前再次点击该按钮。
当您设置断点时,调试器会获得焦点并允许应用再次同步。
您可以在单击按钮后立即禁用该按钮,然后在处理完成后重新启用该按钮。如果您无法解决潜在问题(例如,它在第三方控件中),那将阻止问题发生。
答案 2 :(得分:1)
我猜它与手动执行调试所需的时间有关。也许你有一些繁重的工作(也许是与数据库的连接),当你调试它有时间完成但是当没有调试它崩溃应用程序
答案 3 :(得分:1)
另一种可能性......
通常,断点可以更改进程的运行时行为,如果您正在查看断点处的代码。例如,如果将鼠标悬停在某个属性上,或打开本地窗口,则会在继续进行更多代码之前动态评估属性。
由于Property的getter实际上只是一个方法,一个写得不好的类实际上可以在属性中进行“额外”工作,以防止代码崩溃。
这不是特别可能,但我确实在一个第三方库中看到了这个,它做了一个属性的延迟初始化,但没有在它的一个方法之前正确初始化它。如果你从未在代码中查看过该属性,那么它会引发异常 - 但只是访问该属性会将其清理干净。