.Net und Bitmap werden nicht automatisch vom GC entfernt, wenn kein Speicher mehr verfügbar ist

8

Ich frage mich, wie funktioniert die Zuweisung und Beseitigung von Speicher für Bitmaps in .net.

Wenn ich eine Menge von Bitmap-Kreationen in Schleifen in einer Funktion mache und sie nacheinander aufrufe, wird es funktionieren, bis die Bitmap irgendwann keinen Speicher mehr zuweisen kann, der die Ausnahme "Ungültiger Parameter" für die angegebene Größe enthält / p>

Wenn ich den Garbage Collector von while aus aufrufen, während es funktioniert.

Mit dem folgenden Code können Sie den Fehler wiederherstellen:

%Vor%     
Marino Šimić 30.04.2011, 00:23
quelle

3 Antworten

14

Das .NET Bitmap class "kapselt eine GDI + -Bitmap", das heißt, Sie sollten Dispose auf% aufrufen co_de% wenn du damit fertig bist,

  

"Ruf immer Dispose vor dir an   Lassen Sie Ihre letzte Referenz auf die   Bild. Ansonsten sind es die Ressourcen   Die Verwendung wird erst nach der Veröffentlichung freigegeben   Garbage Collector ruft das Image auf   Objekt ist Finalize-Methode. "

    
Mitch Wheat 30.04.2011, 00:28
quelle
17

Die Bitmap-Klasse ist unweigerlich die, in der Sie haben um zu ignorieren, dass IDisposable existiert. Es ist eine kleine Wrapper-Klasse um ein GDI + -Objekt. GDI + ist nicht verwalteter Code. Die Bitmap belegt nicht verwalteten Speicher. Eine Menge davon, wenn die Bitmap groß ist.

Der .NET-Garbage Collector stellt sicher, dass nicht verwaltete Systemressourcen mit dem Finalizer-Thread freigegeben werden. Problem ist, dass es nur in Aktion tritt, wenn Sie genügend Mengen von verwalteten Objekten erstellen, um eine Garbage Collection auszulösen. Das wird nicht gut für die Bitmap-Klasse funktionieren, Sie können viele Tausende von ihnen erstellen, bevor die Generation # 0 des Garbage Collected Heaps voll wird. Sie werden nicht mehr über den nicht verwalteten Speicher verfügen, bevor Sie dorthin gelangen können.

Das Verwalten der Lebensdauer der von Ihnen verwendeten Bitmaps ist erforderlich. Rufen Sie die Dispose () -Methode auf, wenn Sie keine Verwendung mehr dafür haben. Das ist nicht immer die goldene Lösung, Sie müssen Ihren Ansatz möglicherweise überdenken, wenn Sie einfach zu viele Live-Bitmaps haben. Ein 64-Bit-Betriebssystem ist die nächste Lösung.

    
Hans Passant 30.04.2011 22:07
quelle
1

Warum verwenden Sie nicht using keyword? Verkapseln Sie einfach Ihr Bitmap-Objekt darin und der Compiler stellt sicher, dass die Dispose-Methode aufgerufen wird.

Es ist einfach eine syntaktische Abkürzung für

%Vor%     
Shekhar_Pro 30.04.2011 00:33
quelle