2012-08-16 16 views
5

मैं Label बना रहा हूं और कभी-कभी Im .DrawToBitmap() का उपयोग कर रहा हूं। मैं क्यों नहीं जानता, लेकिन मैं थोड़ी देर के लिए मेरे कार्यक्रम चलाने (और .DrawToBitmap() अक्सर बुला) के बाद मैं अपवाद: कि अक्सरDrawToBitmap - System.ArgumentException: पैरामीटर मान्य नहीं है

System.ArgumentException: Parameter is not valid. 
    at System.Drawing.Bitmap..ctor(Int32 width, Int32 height, PixelFormat format) 
    at System.Drawing.Bitmap..ctor(Int32 width, Int32 height) 

किसी तरह मैं फोन नहीं कर सकते हैं इस समारोह। अगर मैं मौलिक इस कोशिश करेंगे:

while(true) 
{ 

    System.Windows.Forms.Label label = new Label(); 

    label.Font = new Font("Arial", 20); 
    label.Text = "test"; 

    try 
    { 
    Bitmap image = new Bitmap(300, 500); 
    label.DrawToBitmap(image, label.ClientRectangle); 
    } 
    catch (Exception e) 
    { 
    Console.WriteLine(e); 
    } 
} 

मैं 5-6 सेकेंड (1000-2000 कॉल) अपवाद के बाद मिला है। समस्या क्या है? इससे कैसे बचें?

संपादित करें: Dispose() के साथ विचार के लिए धन्यवाद दोस्तों - अगर मैं इसे label पर उपयोग करता हूं तो सबकुछ सही काम कर रहा है। भले ही मैं बिटमैप पर इसका उपयोग न करें। जवाब में से दोनों महान हैं, मैं सिर्फ उन्हें :(की 1 स्वीकार कर सकते हैं

उत्तर

6

तो, कि त्रुटि संदेश गहरे GDI + में से आता है और एक बहुत कारण से के लिए प्रकट हो सकता है। मैं अपने कोड के साथ एक स्पष्ट समस्या देखते हैं कि एक उम्मीदवार तथापि है:।।

label.Font = new Font("Arial", 20); 

Font वस्तुओं IDisposable को लागू करने और आप एक तंग पाश में उनमें से एक बहुत बनाने और कभी नहीं Dispose() बुला रहे हैं एक ही बिटमैप खुद के लिए चला जाता है मुझे यकीन है कि GDI से बाहर चल रहा है संसाधन

यह हर है डी के रूप में आपके कोड की भावना बनाने के लिए। यह अनिवार्य रूप से कुछ भी नहीं करता है लेकिन Font और Bitmap ऑब्जेक्ट्स का एक टन बनाते हैं, इसलिए मैं उन घोषणाओं में से प्रत्येक को using कथन में लपेटने का भी सुझाव नहीं दे सकता। उस तरफ, जब आप बिना किसी निपटारे के त्वरित उत्तराधिकार में जीडीआई वस्तुओं का एक टन बनाते हैं तो आप अंततः इस समस्या में भाग लेंगे।

यदि आपको इन ऑब्जेक्ट्स को कुछ समय के लिए मान्य होने की आवश्यकता है तो आपको यह सुनिश्चित करना होगा कि आप Dispose() पर बाद में देशी संसाधनों को यथासंभव यथासंभव रिलीज़ करने के लिए कॉल करें (अंतिमकर्ता यह आपके लिए करेगा, लेकिन यह सर्वोत्तम है इसके लिए इंतजार नहीं करना है)। वे कर रहे हैं स्थानीय वस्तुओं फिर एक using बयान में उन्हें लपेटो इसलिए Dispose() जब ब्लॉक बाहर निकलता है बुलाया जाएगा:

using(var b = new Bitmap(w, h)) 
{ 
    // use 'b' for whatever 
} // b.Dispose() is called for you 
+0

हाय। पहले मैंने कोशिश की (बिटमैप ...) => कोई बदलाव नहीं। लेकिन जब मैं लेबल का उपयोग कर रहा था। प्रत्येक कॉल के अंत में() का प्रयास करें सब कुछ ठीक था :) धन्यवाद - 30,000 कॉल के साथ इसका परीक्षण किया, मुझे लगता है कि अब ठीक है। लेबल के बिना। मान लीजिए() मुझे 1000-2000 कॉल के बाद अपवाद मिलता है। कभी सोचा नहीं कि मुझे लेबल() लेबल का निपटान करना है। – miri

+0

@miri: @ हंसपैसेंट की तरह: मैंने सोचा होगा कि लेबल का निपटान अपवाद का कारण बनता है। मेरा मानना ​​है कि यह फ़ॉन्ट और बिटमैप है जिसे 'उपयोग' ब्लॉक में लपेटा जाना चाहिए। मुझे नहीं पता कि लेबल को अन्यथा लेबल के तरीके के बिना लेबल का निपटान करने में आप कैसे सक्षम हो सकते हैं। – IAbstract

4

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

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

कोड स्निपेट मतलब नहीं है, लेकिन आप लिखते हैं इस तरह अपवाद से बचने के लिए:

using (Bitmap image = new Bitmap(300, 500)) { 
    label.DrawToBitmap(image, label.ClientRectangle); 
} 
+1

मैं गंभीरता से, * गंभीरता से * जीडीआई त्रुटि संदेशों से नफरत करता हूं ... इसे केवल समस्या का निदान करने के लिए अनुभव की आवश्यकता होती है, जो संदेश को बेकार बनाता है। –

+0

विचार के लिए धन्यवाद! निपटान() बहुत अच्छा है, लेकिन किसी भी तरह मुझे इसे लेबल पर उपयोग करने की आवश्यकता है। – miri

+0

अच्छा, नहीं, यह सुनिश्चित है कि आप लेबल को निपटाना नहीं चाहते हैं, जो इसे गायब कर देगा और आपके कोड को क्रैश करेगा। बिटमैप का निपटान करें। –