2012-10-29 40 views
9

मुझे अभिभावक नियंत्रण में बहुत सारे नियंत्रण जोड़ने की आवश्यकता है।SuspendLayout और ResumeLayout प्रदर्शन को कम करने क्यों जोड़ रहा है?

लेकिन अगर मैं पहले ParentControl.SuspendLayout और ParentControl.ResumeLayout जोड़ सकते हैं और मैं माता-पिता के लिए उन नियंत्रणों को जोड़ने के बाद, मैं स्टॉप वॉच का उपयोग टिक को मापने के लिए मुझे लगता है: अगर मैं कोड ParentControl.SuspendLayout और ParentControl.ResumeLayout निकालने के लिए, यह तेजी से हो जाएगा। ऐसा क्यों होता है?

तो SuspendLayout और ResumeLayout उप नियंत्रण जोड़ने के लिए समय को कम नहीं करना चाहिए, है ना? तो SuspendLayout और ResumeLayout या अन्य शब्दों में उपयोग करने का क्या फायदा है, यदि मैं SuspendLayout और ResumeLayout का उपयोग नहीं करता हूं लेकिन उप-नियंत्रण सीधे माता-पिता को जोड़ता हूं, तो क्या बुरा है?

+0

आप कितने नियंत्रण जोड़ रहे हैं? यदि यह कुछ ही है तो इसकी कोई आवश्यकता नहीं है, लेकिन यदि आप सैकड़ों/हजारों को जोड़ रहे हैं तो आपको एक अंतर देखने की अधिक संभावना है।इसके अलावा, अगर आपने इसे समय दिया तो दो बार के बीच क्या अंतर था; क्या यह सिर्फ कुछ छोटी राशि थी (निष्पादन के समय में केवल यादृच्छिक भिन्नता होने के लिए पर्याप्त) या यह वास्तव में महत्वपूर्ण था? – Servy

+0

आप किस प्रकार के नियंत्रण का उपयोग कर रहे हैं? इसी तरह की समस्या का वर्णन किया गया है [यहां] (http://www.clubfarpoint.com/Forums/forums/thread/32939.aspx)। – Neolisk

+0

हाँ, मैं सैकड़ों नियंत्रण जोड़ता हूं। – spspli

उत्तर

8

यह सामान्य कारण है, कोड को हटाने से आम तौर पर आपका प्रोग्राम तेजी से चलता है।

निलंबित/पुन: प्रारंभ करें() काफी सार्वभौमिक रूप से गलत समझा जाता है। यह केवल तभी प्रभावित होगा जब आपके पास ऐसे नियंत्रण हों जिनमें गैर-डिफ़ॉल्ट ऑटोसाइज, डॉक या एंकर संपत्ति हो। यह लेआउट दुर्घटनाओं को रोकता है जब नियंत्रण में लेआउट गुण होते हैं जो एक-दूसरे को प्रभावित करते हैं।

यदि आपके पास सैकड़ों नियंत्रणों के साथ कोई फ़ॉर्म है तो यह बहुत संभावना नहीं है कि आप इन गुणों का उपयोग करें। इस तरह की एक विशाल खिड़की आसानी से स्वचालित लेआउट में खुद को उधार नहीं देता है। तो आप उन तरीकों को बुला रहे हैं जो वास्तव में कुछ भी नहीं करते हैं, वे लेआउट को फिर से शुरू करने के लिए समय लेते हैं लेकिन बिना किसी लाभ के।

12

शायद आप इसके बजाय ResumeLayout (false) का उपयोग करना चाहते हैं। MySubPanel.ResumeLayout() को कॉल करना। ResumeLayout (true) के बराबर है, जिसका अर्थ है कि इसे इस नियंत्रण को फिर से लेआउट करना चाहिए (और उस बिंदु पर सब कुछ बाल-नियंत्रण जिसे निलंबित नहीं किया गया है) तुरंत।

एमएसडीएन उद्धरण: "रेज़्यूमेलाइट विधि को कॉल करना [पैरामीटर के बिना] कोई लंबित लेआउट अनुरोध होने पर तत्काल लेआउट को मजबूर करता है।" [1]

आप एक पैनल के लिए 100 नियंत्रण जोड़ने की तरह हैं, तो आप इस तरह एक दृष्टिकोण का उपयोग करना चाहते हैं:)

  1. mainPanel.SuspendLayout (
  2. बच्चे नियंत्रण
  3. कॉल बच्चे पैदा करते हैं। SuspendLayout()
  4. परिवर्तन बच्चे नियंत्रण गुण
  5. mainPanel
  6. कॉल child.ResumeLayout के लिए बच्चे नियंत्रण जोड़ने (गलत) - इसका मतलब यह है: अगले लेआउट रन इस पर नियंत्रण relayout, लेकिन तुरंत नहीं
  7. हर बच्चे-नियंत्रण के लिए
  8. दोहराने (2-6)
  9. कॉल mainPanel.ResumeLayout (सही) - इसका मतलब है: मेरे mainPanel और हर बच्चे को नियंत्रण relayout अभी व!

नोट: बिना SuspendLayout(), एक नियंत्रण के लिए हर संपत्ति परिवर्तन आह्वान होता लेआउट दिनचर्या - यहां तक ​​कि बदलते .BackColor अपने नियंत्रण फिर से लेआउट ही बनाता है।

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

+1

नियंत्रण को निलंबित नहीं करते हैं, तो यह विशेष रूप से तब होता है जब हम संपत्ति परिवर्तन करने के लिए बहुत से नियंत्रण (लूप) के माध्यम से पुनरावृत्त कर रहे हैं। लूप मामले पर बड़ा प्रभाव। धन्यवाद! – rajkumaradass