Question

Quelle est la bonne façon d'effectuer une finalisation statique?

Il n'y a pas de destructeur statique. L'événement AppDomain.DomainUnload n'est pas déclenché dans le domaine par défaut. L'événement AppDomain.ProcessExit partage la durée totale des trois secondes (paramètres par défaut) entre tous les gestionnaires d'événements, il n'est donc pas vraiment utilisable.

Était-ce utile?

La solution

En gros, vous ne pouvez pas. Choisissez votre chemin dans la mesure du possible.

N'oubliez pas qu'un programme peut toujours se terminer brusquement de toute façon - une personne qui retire le pouvoir en est l'exemple évident. Donc, tout ce que vous faites doit être "meilleur effort". - Dans ce cas, espérons que AppDomain.ProcessExit suffirait.

Que devez-vous faire dans votre cas particulier?

Autres conseils

  

Herfried Wagner a écrit un excellent article expliquant comment mettre en œuvre ce & # 8211 ; hélas, en allemand (et VB). Néanmoins, le code devrait être compréhensible.

je l'ai essayé:

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");
  }
}

Cela semble fonctionner exactement de la même manière que l'événement AppDomain.ProcessExit : le finaliseur obtient ca. trois secondes ...

Je me demanderais ce que vous chargez dans vos méthodes statiques à publier. Je ne recommanderais certainement pas de faire ces choses de manière statique.

Cela dit, votre méthode statique pourrait instancier un objet doté d'une méthode de finalisation.

Deux solutions qui me viennent à l’esprit:

  • N'utilisez pas de classe statique. Si vous utilisez une classe non statique et l'instanciez, vous n'aurez plus à vous préoccuper du nettoyage.
  • Si ce n'est pas une option, je dirais que c'est une bonne situation pour utiliser un singleton. Cela instanciera une copie de votre objet et le finaliseur sera appelé à la sortie, mais vous permettra tout de même de le traiter comme une classe statique pour la plupart. Après tout, votre classe est déjà statique et partage donc la plupart des raisons courantes de ne pas utiliser un singleton.

Porter la réponse de Michael Damatov (C #) basée sur Herfried K. Wagner. (VB.NET), voici la version C ++ / CLI:

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. Tout comme la méthode AppDomain.ProcessExit, celle-ci ne peut pas être appelée si le processus est arrêté de manière anormale (à partir du Gestionnaire de tâches par exemple). Autre mise en garde: si MyClass est générique (modèle), l'hypothèse selon laquelle son constructeur statique et son destructeur statique ne seront appelés qu'une fois par exécution de l'application n'est plus valide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top