11 Stimmen

Finalizer nicht aufgerufen

Ich habe eine Klasse in C#, wo ich einige Kommunikationsanschlüsse ordnungsgemäß schließen möchte, wenn meine Klasse entsorgt wird. Der Finalizer wird jedoch nie aufgerufen, wenn ich das Programm beende. Woran liegt das? Mache ich etwas falsch?

Ich rufe die Dispose-Funktion manuell auf, die alle Mitteilungen durchläuft und schließt. Dies wird auch nicht abgefeuert.

Hier ist der Finalizer, den ich verwende:

~Power()
{
    Dispose(false);
}

10voto

Reed Copsey Punkte 536986

Der Finalizer (den Sie hier verwenden) wird nur während der Finalisierungsphase aufgerufen, die während der GC stattfindet.

Wenn Sie IDisposable richtig implementieren, sollte dies nie aufgerufen werden. Ich behandle dies im Detail unter meine Serie über IDisposable .

Das heißt, wenn Ihre "Kommunikationsports" über verwaltete Klassen gehandhabt werden, sollten Sie einen Finalizer überhaupt nicht verwenden. Dies bedeutet einen zusätzlichen Overhead, der Ihnen in keiner Weise hilft. Implementieren Sie einfach IDisposable (ordnungsgemäß) und lassen Sie die verwalteten Wrapper um die Port-Klassen die Finalisierung durchführen, falls erforderlich.

7voto

Hans Passant Punkte 894572

Wenn ein Baum im Wald fällt, ohne dass jemand in der Nähe ist, der es hören kann, macht er dann ein Geräusch? Vergewissere dich, dass er es tut:

using System;

class Program {
    static void Main(string[] args) {
        new Test();
    }
}

class Test {
    ~Test() { Console.Beep(); }
}

Die Finalisierer aller Objekte, die bei Beendigung des Programms übrig bleiben, werden kurz vor der Beendigung des Prozesses aufgerufen. Die einzige Möglichkeit, dass dies nicht geschieht, ist, wenn der Prozess unsanft abgebrochen wird. Environment.FailFast() zum Beispiel.

0voto

Bala R Punkte 104615

Der Finalizer wird vom Garbage Collector aufgerufen, und die Garbage Collection ist kein vorhersehbarer Prozess, daher ist sie nicht sehr zuverlässig. Sie müssen andere Wege finden, um Ihre Ressourcen zu entsorgen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X