C# fuite de Mémoire dans le Bitmap
J'ai eu une fuite de mémoire dans mon application dans ces lignes.. Si je prends un coup d'oeil dans le gestionnaire de tâche, à chaque fois que ce processus est déclenché, la mémoire RAM est en hausse de +- 300 MO..
Bitmap bmp1 = new Bitmap(2480, 3508);
panel1.DrawToBitmap(bmp1, new Rectangle(0, 0, 2480, 3508));
pictureBox2.Image = bmp1;
Quelqu'un peut m'aider avec sa fuite? Si j'utilise:
bmp1.Dispose();
J'obtiens une exception dans le "Programme.cs" à cette ligne: Application.Run(new Form1());
Et après cela, l'application est arrêtée en cours d'exécution...
Écran de l'application:
- Et l'exception est? ObjectDisposedExeption?
- Offtopic Mais éviter de regarder dans le gestionnaire des tâches et découvrez l'analyseur de Performances à la place
- Vous devez disposer de l'image une fois que vous avez fini avec elle. Est-il un point dans votre application lorsque vous n'avez plus l'affichage de l'image? Si oui, c'est là que vous devez vous en débarrasser.
- Je pense qu'il est de répéter le processus et la vieille image n'est pas nettoyé (au moins pas tout de suite).
- L'image est toujours dans l'écran dans la picturebox1
- Aucune exception sont les suivants: paramètre non Valide.
Vous devez vous connecter pour publier un commentaire.
Mise à jour: Vous n'avez pas une fuite de mémoire soi, vous avez juste à attendre pour le Garbage Collector pour libérer les ressources.
Si vous ne voulez faire le garbage collector
collect
bien, vous pouvez faire ceci:Pourquoi avez-vous besoin de disposer de l'image bitmap? Si votre PictureBox est de l'utiliser, alors vous avez besoin de l'image bitmap. Si vous êtes à changer beaucoup de choses, peut-être que vous devez remplacer l'ancienne image bitmap pour un nouveau et de disposer de l'ancien:
Dispose
qui est apparemment provoquer une exception.bmp1.Dispose();
directement?using
.pictureBox2.Image = (Bitmap)bmp1.Clone();
. Cela étant dit, la deuxième solution est probablement mieux que je ne pense pas que le premier en fait des réponses à votre question. J'ai édité la réponse pour faire plus de sens.Clone()
méthode ne va pas se débarrasser de votre vieille image, voir ma nouvelle mise à jour du code et essayer, laissez-moi savoir comment cela fonctionne. Remarque, vous n'utilisez pas unusing
bloc maintenant.Bitmap and Image never close the underlying stream. You'll have an eternal lock on that file, until the GC cares about collecting the floating reference
. Si vous êtes en s'appuyant sur la GC encore.Je suppose que vous jetez seulement l'image que vous n'avez pas besoin de plus. Vous avez encore besoin de la
bmp1
créé, il suffit de fixer le contenu de lapictureBox2.Image
champ . Essayez quelque chose le long de ces lignes:Disclaimer: je ne suis pas expérimenté avec C#, donc j'ai peut-être mal...
Vous devez utiliser externes gdi32.dll pour éviter bitmap fuites de mémoire