过去,我遇到过冻结问题,这是由于在为该控件创建句柄之前使用该控件对 UI 线程上的调用进行编组而导致的。 (看金·格林利的博客 http://krgreenlee.blogspot.com/2007/09/onuserpreferencechanged-hang.html了解更多信息)。
使用这种方法(递归实现),我确保在应用程序中创建的所有控件在构造时都有句柄。具体来说,这是在设计者调用初始化控件的 GUI 之后完成的。
我的问题是:
问 - 除了性能之外,是否还有其他原因不确保所有控件都以这种方式具有句柄?
我问这个问题是因为我们遇到了放置在基础设施面板内的基础设施控件的问题。当用户修改此面板的大小时,所包含的 Infragistics 控件的大小不会正确调整大小,即使它的 Dock 属性设置为 Dock.Fill。还有一个问题是,此控件中出现的工具提示不再显示在鼠标旁边。如果容器和包含控件都不能确保它们具有为自己及其所有子控件创建的句柄,那么这两个问题都可以解决。
我希望这里有人能够回答我的问题。任何可以解释为什么我也可能会看到这个问题的人都可以得到布朗尼点! =) 但我认为这个问题更适合 Infragistics 团队。
Cheers!
您在自己的代码中编组时是否遇到这些问题,或者是否在某些外部代码上发生过?
我也遇到过几次这些问题,并转而使用 SynchronizationContext 类。此类的明确优点是您不需要任何控件来在线程之间进行编组。
您需要在要调用的线程(即 UI 线程)上获取该类的实例,如下所示:
private SynchronizationContext m_oSyncContext = SynchronizationContext.Current ?? new SynchronizationContext();
使用此实例,您可以使用任何线程中的 Post/Send 方法将消息同步发送到检索该实例的线程。
这样做的缺点是您必须确保在正确的线程上检索实例,我建议像上面的示例一样进行操作。如果您在当前实例已经存在的情况下创建实例,则可能会产生一些令人讨厌的副作用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)