2010-11-18 64 views
2

我正在与旧的“错误创建窗口句柄”的乐趣作斗争。我的应用程序有一个中心区域,用于承载用户当前正在处理的任何控制。当用户加载一个新的控件时,我摧毁了旧的控件。或者至少我尝试。当我运行任务管理器时,我惊讶地发现,随着新控件的加载,GDI对象的数量并未减少。这正是我正在做的(试图)杀掉我完成的一个控制。该计数器最后显示了一个巨大的数字,这似乎是正确的,但任务管理器中的GDI对象保持不变,直到达到10,000,然后一切都崩溃了。错误创建窗口句柄

private void RecursivelyKillYourself(Control C) { 
     if (C.Controls != null && C.Controls.Count > 0) { 
      List<Control> Controls = C.Controls.OfType<Control>().ToList(); 
      C.Controls.Clear(); 
      Controls.ForEach(c_inner => RecursivelyKillYourself(c_inner)); 
     } else { 
      C.Dispose(); 
      num++; 
     } 
    } 

编辑

固定 - 得确保你正确地创建工具提示。另外,正如一位评论员指出的那样,漫长的愚蠢的递归方法是不必要的。只需简单的Dispose即可。

(new SMcMaster.TabOrderManager(this)).SetTabOrder(SMcMaster.TabOrderManager.TabScheme.AcrossFirst); 

ToolTip T = new ToolTip(); 
T.SetToolTip(btnAddPropertyInvoice, "Add Properties"); 
components.Add(T); 
+1

仅仅在您正在使用的控件上调用Dispose就不够吗?控制器应该自动处理其子女。当然,假设控制是正确书写的。 – 2010-11-18 15:40:48

+0

如果您有自定义控件并且正在重写处置或更好,但未实现所需的额外处理,则需要在这些控件中执行操作,否则可能会陷入这种困境。您是否已验证Dispose在自定义控件类型中的实际行为...如果它们确实存在...?关于Dispose的好文章... http://blogs.msdn.com/b/jfoscoding/archive/2005/08/12/450835.aspx – 2010-11-18 15:40:48

+0

我正在创建我的工具提示不正确,而这些提示并未处理 - 请参阅编辑。感谢您的回复 – 2010-11-18 15:56:39

回答

1

验证正在妥善解决Dispose