确保创建的每个控件都有.NET的句柄有什么副作用?

时间:2010-12-07 10:41:04

标签: .net winforms controls infragistics handle

在过去,我遇到了一个冻结问题,这个问题是在为该控件创建句柄之前,控件被用于在UI线程上编组调用的结果。 (有关详细信息,请参阅Kim Greenlee's blog。)

使用此方法 - 以递归方式实现 - 我确保在应用程序中创建的所有控件在构造时都有句柄。具体来说,这是在设计者调用初始化控件的GUI之后完成的。

我的问题是:

问:除了性能之外,还有其他原因不能确保所有控件都以这种方式处理吗?

我问,因为我们遇到了Infragistics控件的问题,该控件位于Infragistics Panel中。当用户修改此面板的大小时,即使它的Dock属性设置为Dock.Fill,包含的Infragistics控件的大小也不会正确调整大小。还存在一个问题,即鼠标旁边不再显示此控件中出现的工具提示。如果容器和包含控件都不能确保它们具有为自己及其所有子控件创建的句柄,则解决这两个问题。

我希望有人能够回答我的问题。布朗尼指出任何能够解释为什么我也会看到这个问题的人! =)但我认为这个问题对于Infragistics团队更有帮助。

干杯!

2 个答案:

答案 0 :(得分:1)

您是否在使用自己的代码进行编组时遇到了这些问题,或者是否在某些外部代码中出现了这些问题?

我也遇到过几次这些问题,并转而使用SynchronizationContext类。这个类的明确专家是你不需要任何控制来在线程之间编组。

您需要在要调用的线程(即UI线程)上获取该类的实例,如下所示:

private SynchronizationContext m_oSyncContext = SynchronizationContext.Current ?? new SynchronizationContext();

使用此实例,您可以使用任何线程中的Post / Send方法(a)将消息同步发送到检索该实例的线程。

这是缺点,你必须确保在正确的线程上检索实例,我建议像上面的示例一样。如果您在已经有当前实例的情况下创建实例,则可能会产生一些令人讨厌的副作用。

答案 1 :(得分:0)

好的,我已经解决了我遇到的具体问题。这不是Infragistics组件的问题。我只是在不正确的时间强制创建句柄......

我在InitializeComponent()调用之后强制在每个自定义Control / Form的构造中创建句柄。对于Forms来说这很好,但是在这个阶段很可能没有将Control放在父Control / Form中。当Control没有父级“保持”它时,强制创建句柄显然是不好的。

所以我改变了我的经验法则,将其实现为:

  • 对于Forms,为Form本身和任何子控件添加所有子控件后强制创建句柄。我通常在InitializeComponent()调用之后继续在Form的构造中执行此操作。
  • 对于控件,在构造Control之后强制创建句柄,并将其添加到它的父Contol / Form中,用于新控件及其所有子控件(如果有)。

所以我认为如果你确保你正确使用这个功能,唯一的缺点是潜在的性能问题(我没有真正注意到这一点)。

我欢迎正式描述使用此功能的缺点,以及如何强制创建控件的句柄之前如何将其置于其父控件中的更多技术说明导致问题,因为我的描述有点简要...

小豆