【发布时间】:2011-08-08 07:51:20
【问题描述】:
最近,我遇到了一个经典的Heisenbug。情况如下:
- 我在一个面板中有一个树列表,即主视图,在右侧的另一个面板中有一个详细视图,它显示有关当前选定树节点的信息。 (非常类似于 Windows 资源管理器。)
- 当我向树中添加一个新节点时(想想在 Windows 资源管理器中右键单击一个文件夹并说“新建 -> 文件夹”),新创建的节点会被选中。
- 这是一个错误:右侧的详细视图应更新以显示新节点。然而,事实并非如此。我必须先切换到另一个树节点,然后才能在详细视图中看到有关新节点的信息。
该错误很容易重现,并且在“发布”和“调试”构建配置中都会发生。但是:只要我在事件处理程序中设置断点(对于“添加新节点”菜单条目)并启用它,一切正常 =>Heisenbug!我不需要做任何真正的调试。断点命中后点击“继续”即可。
为了更好地理解,我制作了 a video 来说明正在发生的事情。
我能想到的解决这个问题的办法就是让线程(应用程序是单线程的)休眠几秒钟,但这不起作用。
对于我可以尝试确定问题原因的任何建议,我将不胜感激。或者也许有人猜到了原因?
我的目标是 3.5 框架并使用 x86 作为解决方案平台。树形列表控件来自DevExpress'WinForms控件; Visual Studio 版本是 2010。
谢谢
更新 3:问题已解决。问题是对详细视图的 Focus() 方法的调用没有触发 GotFocus 事件,这对于更新详细视图至关重要。 (我不知道为什么,可能它已经有了焦点。)但是,该方法并没有失败,它根本没有做任何事情。
现在我只关注另一个控件,然后再关注细节视图,仅此而已。调试期间一切正常的原因是从 Visual Studio 切换回我的应用程序正确地将焦点设置在详细视图上。
解决此问题的一个主要障碍是在 GotFocus 事件处理程序中设置断点是没有用的:每当您尝试从 Visual Studio 切换回应用程序时,GotFocus 事件都会重新触发,并且您会被卡住在一个无限循环中。欢迎就如何解决此问题发表评论。
不管怎样,我的具体问题已经解决了。
非常感谢所有回答或评论的人。这对我帮助很大。
更新 2:在我的代码中,我选择了树中新创建的节点。这会触发 FocusedNodeChangedEvent。在相应的事件处理程序中,我更新详细视图并调用其 Focus() 方法。
似乎在没有设置断点时会失败。我认为在调试期间触发正确更新的是详细视图自动获得焦点。
窗口消息
更新 1:这是 Eddy 的回答提供的窗口消息。 (一长串已删除的消息)
【问题讨论】:
-
我必须承认,尽管视频对我来说并没有增加多少,但这是我更想看到的。向你致敬,先生
-
视频+1(以及真正准确的问题描述) - Deutsche Gründlichkeit
-
谢谢,伙计们。很高兴看到视频受到赞赏。
-
树列表中的哪些事件会导致详细信息面板的更新,或者这一切都是由树列表本身在内部完成的?创建新节点似乎不会触发更新详细视图的事件,同时从窗口获取焦点并将其放回(切换到调试器)会。
-
Eddy,我已经用该信息更新了主帖。
标签: c# .net visual-studio