J'étudie une fuite de ressources GDI dans une grande application. Afin de mieux comprendre comment ces problèmes se produisent, j'ai créé une très petite application que j'ai délibérément fait «couler». Voici un contrôle utilisateur simple qui devrait aboutir à la création de 100 objets Pen:Comment puis-je créer des fuites GDI dans Windows Forms!
public partial class TestControl : UserControl { private List pens = new List(); public TestControl() { InitializeComponent(); for (int i = 0; i < 100; i++) { pens.Add(new Pen(new SolidBrush(Color.FromArgb(255, i * 2, i * 2, 255 - i * 2)))); } this.Paint += new PaintEventHandler(TestControl_Paint); } void TestControl_Paint(object sender, PaintEventArgs e) { for (int i = 0; i < 100; i++) { e.Graphics.DrawLine(pens[i], 0, i, Width, i); } } }
Cependant, lorsque je crée une instance de mon objet et l'ajouter à une forme, regardant ma demande avec TaskManager Je vois actuellement ~ 37 objets GDI. Si je ajoute à plusieurs reprises de nouveaux contrôles utilisateur TestObject à mon formulaire, je toujours seulement voir ~ 37 objets GDI.
Que se passe-t-il ici! Je pensais que le constructeur de System.Drawing.Pen utiliserait l'API GDI + pour créer un nouveau Pen, utilisant ainsi un nouvel objet GDI.
Je dois être fou ici. Si je ne peux pas écrire une application de test simple qui crée des objets GDI, comment puis-je en créer un qui les fuit!
Toute aide serait grandement appréciée.
Cordialement, Colin E.
Un problème étrange là-bas, je suis d'accord. Avez-vous vérifié si le non. des objets GDI diminue de 37 si vous boucle * moins * que 37 fois? – Noldorin
Oui - les 37 objets GDI semblent concerner le surdébit de l'application de test simple elle-même. Cela n'a rien à voir avec le nombre de boucles dans le code ci-dessus. Je pense que l'OregonGhost (ci-dessous) est sur quelque chose que GDI + n'utilise pas les poignées de GDI, que j'ai supposé qu'il a fait! J'aurais aimé qu'il y ait de la documentation là-bas pour vérifier cela. –