为什么加入SuspendLayout和ResumeLayout降低性能?(Why is adding

2019-08-02 01:52发布

我需要大量的控件添加到父控件。

但我发现,如果我添加ParentControl.SuspendLayoutParentControl.ResumeLayout之前和之后我添加这些控件到父,我用秒表来测量刻度:如果我删除代码ParentControl.SuspendLayoutParentControl.ResumeLayout ,它会更快。 为什么会发生?

所以SuspendLayoutResumeLayout不应该减少添加子控件的时间,对不对? 那么什么是使用效益SuspendLayoutResumeLayout或者换句话说,如果我不使用SuspendLayoutResumeLayout而是直接添加子控件的父母,有什么不好?

Answer 1:

这是通常的原因,删除代码通常使程序运行得更快。

暂停/ ResumeLayout()是相当普遍误解。 它只会有,当你有一个具有非默认自动调整大小,码头或锚属性控制的影响。 它可以防止意外的布局时,控件具有相互影响的布局属性。

如果您有数百个控件的形式则是非常不可能的,你在所有使用这些属性。 这样一个庞大的窗口不会轻易借给自己自动布局。 所以,你拨打的实际上并不做任何事情的方法,他们需要时间来重复布局但没有任何好处。



Answer 2:

你可能想使用.ResumeLayout(假)来代替。 调用mySubPanel.ResumeLayout()等于.ResumeLayout(真),这意味着它应该重新布局这一控制(以及一切儿童控制未在该点暂停)马上。

MSDN报价:“调用ResumeLayout方法[无参数]强制,如果有任何挂起的布局请求立即进行布局。” [1]

如果你喜欢添加100个控制面板,你想用这样的方法:

  1. mainPanel.SuspendLayout()
  2. 创建子控件
  3. 调用child.SuspendLayout()
  4. 改变孩子的控制特性
  5. 子控件添加到的mainPanel
  6. 调用child.ResumeLayout(假) - 这意味着:未来布局来看,重新布局这种控制,但不会立即
  7. 重复(2-6)为每个孩子控制
  8. 调用mainPanel.ResumeLayout(真) - 这意味着:重新布局我的mainPanel,现在每个孩子控制!

注:无SuspendLayout(),用于控制每个属性的更改将调用布局规 - 甚至改变.BackColor让您控制重新布局本身。

[1] http://msdn.microsoft.com/en-us/library/y53zat12.aspx



文章来源: Why is adding SuspendLayout and ResumeLayout reducing performance?