2009-07-21 11 views
5

Mein Verständnis über diese Klasse ist, dass Sie es verwenden sollten, wenn Sie sicher sein wollen, dass der Finalizer (Destruktor) oder die Klasse aufgerufen wird, aber aus ein paar Tests, die ich gemacht habe, scheint es nicht wahr zu sein. Wenn es nicht sicherstellt, dass die dispose-Methode aufgerufen wird, gibt es eine andere Möglichkeit, dies zu tun? Zum Beispiel, wenn ich sicherstellen möchte, dass Code ausgeführt wird, um mein Objekt zu beenden, selbst wenn ich mein Programm über den Task-Manager schließe oder so?(.net) CriticalFinalizerObject - Was macht es wirklich?

+1

Wenn einige Code ausgeführt werden könnte, Ihr Objekt zu beenden, dann könnte der Task-Manager nicht in der Lage das Programm zu schließen. Aus diesem Grund stoppt der Task-Manager "Prozess beenden" Ihren Prozess ohne seine Kooperation, indem er die gesamte Ausführung wegnimmt und so die Ausführung von Code, Bereinigung oder anderweitig verhindert. –

+0

Ich würde nur bemerken, dass die Frage bearbeitet werden sollte, oder dass es ein Problem in den OPs Verständnis von Entsorgung vs. Finalisierung identifiziert hat, wie die Finalize() - Methode und Dispose() -Methode (und Paradigmen) völlig unterschiedlich sind. –

Antwort

2

aus ein paar Tests, die ich getan habe, scheint es nicht wahr zu sein.

Finalizer in .Net sind nicht deterministisch. Das bedeutet, es gibt keine Garantie genau wenn der Finalizer aufgerufen wird. Nur weil ein Objekt außer Reichweite geriet oder sogar entsorgt wurde, heißt das nicht, dass der Finalizer sofort aufgerufen wird. Der Müllsammler wird zu einem unbekannten Zeitpunkt in der Zukunft dazukommen.

+0

Nun, wie 20 Minuten vergangen und es führte immer noch nicht den Code: P –

+0

Der Müllsammler ist es egal, wie viel Zeit vergangen ist. Wenn keine Zuordnungen vorgenommen werden, wird es nicht ausgeführt. Die wichtige Frage ist also, was der Code in diesen 20 Minuten getan hat - oder ob der Finalizer beim Beenden der Anwendung ausgeführt wurde. – jalf

+0

Ich öffnete die Anwendung, Strg + Alt + del'ed es. –

7
+0

Hmm, so scheint CriticalFinalizerObject nicht, was ich mir angesehen habe. Gibt es irgendeine Möglichkeit, dass ich sicher sein kann, dass meine Finalize-Methode aufgerufen wird, auch wenn es eine Strg + Alt + Del gibt? –

+0

Wenn Sie nach zuverlässigen Operationen suchen, selbst wenn das Betriebssystem abstürzt (Stromausfall?), Dann sollten Sie sich die Transaktionsverarbeitung ansehen. –

+0

Ich brauche nicht viel, ich muss nur etwas Code ausführen können, wenn die Anwendung geschlossen oder Strg + Alt + Del'ed ist. –

2

Wenn Sie wirklich Code benötigen, wenn sie ausgeführt werden, wenn Ihr Programm ist Strg + Alt + Del'd, ich glaube nicht, dass es eine andere Möglichkeit, als ein separates Programm zu haben, das die ersten Monitoren Zustand. Wenn Sie wirklich so viel Architektur benötigen, sollten Sie einen Dienst und einige Client-Apps oder ein Paar oder Dienste verwenden.

Dies setzt jedoch voraus, dass Sie sich bereits die Anwendungsereignisse angesehen haben. Wenn nicht, sehen Sie sich this overview an.

EDIT Besser als diese Übersicht ist wahrscheinlich die ApplicationExit event.

+0

Beide scheinen Formen verwandt zu sein, in diesem Fall war dies eigentlich eine Konsolenanwendung. –

0

Die Methode Finalize() und Dispose() sind verschiedene Dinge.

Standardmäßig würde Dispose nie aufgerufen werden. Sie müssten es selbst von der Finalize Methode anrufen. Betrachten Sie die folgende (die offensichtlichen Fehler in einer richtigen Finalisierung ignorieren/entsorgen Muster hier der Kürze halber):

public class Foo : IDisposable 
{ 
    public void Dispose() 
    { 
     // NOP 
    } 

    ~Foo() 
    { 
     Dispose(); 
    } 
}