Frage

Was ist der richtige Weg, um einige statische finallization durchführen?

Es gibt keinen statischen destructor. Das AppDomain.DomainUnload Ereignis wird in der Standarddomäne nicht erhöht. Die AppDomain.ProcessExit Veranstaltung teilt sich die Gesamtzeit der drei Sekunden (Standardeinstellungen) zwischen allen Event-Handler, so ist es nicht wirklich brauchbar.

War es hilfreich?

Lösung

Im Grunde kann man nicht. Gestalten Sie Ihren Weg, um es in vollem Umfang möglich.

Vergessen Sie nicht, dass ein Programm immer endet abrupt sowieso - jemand die Durchzugskraft aus dem naheliegendes Beispiel zu sein. Also alles, was Sie tun hat "best effort" zu sein -. In diesem Fall I sicherlich würde Hoffnung , dass AppDomain.ProcessExit wäre gut genug sein

Was müssen Sie tun, in Ihrem Fall?

Andere Tipps

  

Herfried Wagner hat eine zu erklären, wie dies zu implementieren - ach, in Deutsch (und VB). Dennoch sollte der Code verständlich sein.

Ich habe es versucht:

static readonly Finalizer finalizer = new Finalizer();

sealed class Finalizer {
  ~Finalizer() {
    Thread.Sleep(1000);
    Console.WriteLine("one");
    Thread.Sleep(1000);
    Console.WriteLine("two");
    Thread.Sleep(1000);
    Console.WriteLine("three");
    Thread.Sleep(1000);
    Console.WriteLine("four");
    Thread.Sleep(1000);
    Console.WriteLine("five");
  }
}

Es scheint genau die gleiche Art und Weise zu arbeiten, wie das AppDomain.ProcessExit Ereignis macht: die Finalizerthread bekommt ca. 3 Sekunden ...

Ich würde fragen, was Sie in Ihren statischen Methoden laden, die gelöst werden müssen. Ich würde nicht empfehlen, diese Dinge in einer statischen Methode zu tun.

Wie gesagt, Ihre statische Methode könnte ein Objekt instanziiert, die eine Methode finalize hat.

Zwei Lösungen, die den Sinn springen:

  • Sie keine statische Klasse. Wenn Sie eine nicht-statische Klasse verwenden und instanziiert es, Sie müssen nicht so viel über Bereinigungs kümmern.
  • Wenn das keine Option ist, würde ich argumentieren, dass dies eine gute Situation ist ein Singleton zu verwenden. Dadurch wird eine Kopie des Objekts instanziiert und haben die Finalizerthread auf Exit aufgerufen, aber noch können Sie es wie eine statische Klasse zum größten Teil behandeln. Denn Ihre Klasse statisch ist bereits und teilt daher die meisten der häufigsten Gründe nicht ein Singleton zu verwenden.

Um den Port Michael Damatov Antwort (C #), die auf Herfried K. Wagner basiert. (VB.NET) ist hier die C ++ / CLI-Version:

ref class MyClass
{
        ref class StaticFinalizer sealed
        {
            !StaticFinalizer();
        };
        static initonly StaticFinalizer^ stDestr = gcnew StaticFinalizer();
}

MyClass::StaticFinalizer::!StaticFinalizer()
{
    System::Diagnostics::Debug::WriteLine("In StaticFinalizer!");
}

P. S. Genau wie die AppDomain.ProcessExit Verfahren kann diesen nicht genannt werden, wenn der Prozess nicht normal beendet wird (von Task-Manager zum Beispiel). Noch ein Wort der Vorsicht ist, dass, wenn MyClass generisch ist (Templat), die Annahme, dass seine statische Konstruktor und statischer destructor werden nicht mehr aufgerufen werden als einmal pro Anwendungsausführung nicht mehr gültig sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top