2015-02-13 14 views
5

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

public partial class MainForm : Form 
{ 
    public MainForm() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 

     // 1. icon increases number of GDI objects used by this app during repaint. 
     //var icon = Resources.TestIcon; 
     //e.Graphics.DrawIcon(icon, 0, 0); 

     // 2. bitmap doesn't seem to have any impact (only 1 GDI object) 
     //var image = Resources.TestImage; 
     //e.Graphics.DrawImage(image, 0, 0); 
    } 
} 

परीक्षण परिणाम:

  1. कोई भी आइकन और बिटमैप्स - 30 GDI वस्तुओं
  2. बिटमैप्स के साथ - 31 GDI वस्तु, नंबर नहीं बदलता है।
  3. आइकन के साथ - 31 और फिर यदि आप खिड़की को पेंट करते हैं तो संख्या बढ़ जाती है।
+0

Posible explcation है कि यह कचरा संग्रहण प्रभाव है: Bitmap' आमतौर पर है '* बड़े * जबकि' Icon' है * छोटे * इतनी बड़ी 'Bitmap's अप को गति प्रदान कचरा संग्रह जो 'बिटमैप' (और * उनका निपटान *) को साफ़ करता है लेकिन 'आइकन' –

+0

@DmitryBychenko नहीं बनाया जाना चाहिए छोटे वस्तुओं को पीढ़ी 0 से संबंधित नहीं होना चाहिए और अधिक बार साफ किया जाना चाहिए? – username

+0

हां, पीढ़ी 0 एकत्रित होने के लिए प्रवण है; एक और मुद्दा यह है कि जीसी सीपीयू कैश आकार आदि पर ध्यान देता है, इसलिए एक बड़ी वस्तु कचरा संग्रह को ट्रिगर कर सकती है। –

उत्तर

1

मेरा मानना ​​है कि आपको मैन्युअल रूप से आइकन का ख्याल रखना है। मैंने कुछ खोज किया और पाया कि जीसी बिटमैप का ख्याल रखता है लेकिन आइकन नहीं। फॉर्म कभी-कभी आइकन की अपनी प्रतिलिपि रखते हैं (मुझे यकीन नहीं है क्यों)। एक तरह से माउस निपटान के लिए यहां पाया जा सकता: http://dotnetfacts.blogspot.com/2008/03/things-you-must-dispose.html

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
extern static bool DestroyIcon(IntPtr handle); 

private void GetHicon_Example(PaintEventArgs e) 
{ 
// Create a Bitmap object from an image file. 
Bitmap myBitmap = new Bitmap(@"c:\FakePhoto.jpg"); 

// Draw myBitmap to the screen. 
e.Graphics.DrawImage(myBitmap, 0, 0); 

// Get an Hicon for myBitmap. 
IntPtr Hicon = myBitmap.GetHicon(); 

// Create a new icon from the handle. 
Icon newIcon = Icon.FromHandle(Hicon); 

// Set the form Icon attribute to the new icon. 
this.Icon = newIcon; 

// Destroy the Icon, since the form creates 
// its own copy of the icon. 
DestroyIcon(newIcon.Handle); 
} 
संबंधित मुद्दे