用户控件中有很多开销吗?

时间:2010-08-12 23:38:24

标签: c# winforms performance .net-3.5 user-controls

我正在开发一个感觉迟钝的WinForms项目。它由数百个用户控件组成。如果存在UI功能(即使未在应用程序中的任何其他位置使用),它也会封装在用户控件中。我已经使用ANTS分析器多次完成了该项目,并且大多数重代码似乎都在各种控件构造函数中。

在我开始删除用户控件之前,它们是否代表了WinForms应用程序的显着开销,而不仅仅是在没有用户控件的情况下布局表单(例如只是内部控件)?

2 个答案:

答案 0 :(得分:3)

我一直处于用户控制地狱,这并不好玩。我注意到的一些事情:

  1. 如果你有太多的用户控件并移动你的表格或滚动,你可以结束大量的白色闪烁,因为深嵌套窗口句柄的绘图操作会争夺渲染时间。首次打开表单时,这一点尤为明显。

  2. 注意设计器中的嵌套用户控件。如果在设计器中打开用户控件,则不会调用构造函数(它实际上是通过解析编译器生成的代码来生成设计器表面。)但是,该用户控件使用的用户控件将调用其构造函数。这通常不是问题,但是如果你看到奇怪的事情发生就值得知道。

  3. 如果您有一个包含大量用户控件的大型解决方案,VS 2008将花费很长时间来枚举所有项目,以便在您第一次打开设计器窗格时找到所有可能的控件。这是一个相对较小的烦恼,但它可能会消耗时间。

  4. 也就是说,用户控件绝对方便,值得适度使用。我试图避免的主要是过深的嵌套。我发现WPF在这方面要好得多。它可以完全控制渲染管道,因此您无法获得与深层控件组合相关的重新绘制问题。

答案 1 :(得分:3)

用户控件是其他控件的容器。拥有数百个可能意味着您的项目中有数百个窗口。窗口是非常昂贵的操作系统对象。当你有超过50左右时,他们开始明显地拖累绘画表演。

与Outlook的比较很贴切。这是一个很好的程序块。它有不到50个窗口。使用Spy ++很容易看到。

不同之处在于OnPaint。微软写了很多代码,他们没有在表单上放弃很多控件。