2012-10-29 23 views
9

Tôi cần thêm nhiều điều khiển vào kiểm soát cha mẹ.Tại sao thêm SuspendLayout và ResumeLayout giảm hiệu suất?

Nhưng tôi thấy nếu tôi thêm ParentControl.SuspendLayoutParentControl.ResumeLayout trước và sau khi tôi thêm những điều khiển để phụ huynh, tôi sử dụng đồng hồ bấm giờ để đo ve: Nếu tôi loại bỏ mã ParentControl.SuspendLayoutParentControl.ResumeLayout, nó sẽ nhanh hơn. Tại sao nó lại xảy ra?

Vì vậy, SuspendLayoutResumeLayout không được phép giảm thời gian thêm điều khiển phụ, phải không? Vì vậy, lợi ích của việc sử dụng SuspendLayoutResumeLayout hoặc nói cách khác, nếu tôi không sử dụng SuspendLayoutResumeLayout nhưng thêm điều khiển phụ trực tiếp cho cha mẹ, điều gì là xấu?

+0

Bạn đang thêm bao nhiêu điều khiển? Nếu chỉ là một vài thì không cần thiết, nhưng nếu bạn đang thêm hàng trăm/nghìn thì bạn có nhiều khả năng thấy sự khác biệt.Ngoài ra, nếu bạn định thời gian thì sự khác biệt giữa hai lần là gì; nó chỉ là một số lượng nhỏ (đủ để chỉ là phương sai ngẫu nhiên trong thời gian thực hiện) hay nó thực sự quan trọng? – Servy

+0

Bạn đang sử dụng loại điều khiển nào? Vấn đề tương tự được mô tả [ở đây] (http://www.clubfarpoint.com/Forums/forums/thread/32939.aspx). – Neolisk

+0

vâng, tôi thêm hàng trăm điều khiển. – spspli

Trả lời

8

Đây là lý do thông thường, việc xóa mã thường làm cho chương trình của bạn chạy nhanh hơn.

Tạm dừng/tiếp tụcLayout() bị hiểu lầm khá phổ biến. Nó sẽ chỉ có ảnh hưởng khi bạn có các điều khiển có thuộc tính AutoSize, Dock hoặc Anchor không mặc định. Nó ngăn ngừa tai nạn bố trí khi điều khiển có thuộc tính bố trí ảnh hưởng lẫn nhau.

Nếu bạn có biểu mẫu với hàng trăm kiểm soát thì rất khó có thể bạn sử dụng các thuộc tính này chút nào. Một cửa sổ lớn như vậy không dễ dàng cho chính nó để bố trí tự động. Vì vậy, bạn đang gọi các phương pháp mà không thực sự làm bất cứ điều gì, họ mất thời gian để lặp lại bố trí nhưng không có lợi ích.

12

Bạn có thể muốn sử dụng .ResumeLayout (false) để thay thế. Gọi mySubPanel.ResumeLayout() bằng .ResumeLayout (true), có nghĩa là nó sẽ bố trí lại điều khiển này (và mọi điều khiển con không bị đình chỉ tại điểm đó) ngay lập tức.

Trích dẫn MSDN: "Gọi phương thức ResumeLayout [không có tham số] sẽ buộc bố cục ngay lập tức nếu có bất kỳ yêu cầu bố cục đang chờ xử lý nào." [1]

Nếu bạn giống như thêm 100 điều khiển để một bảng điều khiển, bạn muốn sử dụng một cách tiếp cận như thế này:

  1. mainPanel.SuspendLayout()
  2. tạo kiểm soát con
  3. gọi con. SuspendLayout() tính chất điều khiển
  4. thay đổi con
  5. thêm sự kiểm soát con đến mainPanel
  6. gọi child.ResumeLayout (false) - điều này có nghĩa là: chạy bố cục tiếp theo, chuyển tiếp kiểm soát này, nhưng không ngay lập tức
  7. lặp lại (2-6) cho mọi kiểm soát trẻ em
  8. gọi mainPanel.ResumeLayout (true) - điều này có nghĩa là: chuyển tiếp chính của tôiPanel và mọi điều khiển con hiện nay!

Lưu ý: không có SuspendLayout(), mọi thay đổi thuộc tính cho điều khiển sẽ gọi bố cục-thường trình - thậm chí thay đổi .BackColor giúp kiểm soát bố cục lại.

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

+1

Điều này giúp đặc biệt trong trường hợp chúng tôi đang lặp qua (vòng lặp) nhiều điều khiển để thực hiện thay đổi thuộc tính. Hiệu ứng tuyệt vời trên trường hợp vòng lặp. Cảm ơn! – rajkumaradass