Domanda

Qual è il modo giusto per eseguire una finallizzazione statica?

Non esiste un distruttore statico. L'evento AppDomain.DomainUnload non viene generato nel dominio predefinito. L'evento AppDomain.ProcessExit condivide il tempo totale dei tre secondi (impostazioni predefinite) tra tutti i gestori di eventi, quindi non è realmente utilizzabile.

È stato utile?

Soluzione

Fondamentalmente, non puoi. Disegna il modo per aggirarlo nella massima misura possibile.

Non dimenticare che un programma può sempre terminare bruscamente in ogni caso - qualcuno che tira fuori il potere è l'esempio ovvio. Quindi, qualsiasi cosa tu faccia deve essere "lo sforzo migliore" - nel qual caso spero che AppDomain.ProcessExit sia abbastanza buono.

Cosa devi fare, nel tuo caso particolare?

Altri suggerimenti

  

Herfried Wagner ha scritto un eccellente articolo spiegando come implementare questo & # 8211 ; ahimè, in tedesco (e VB). Tuttavia, il codice dovrebbe essere comprensibile.

L'ho provato:

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

Sembra funzionare esattamente allo stesso modo dell'evento AppDomain.ProcessExit : il finalizzatore ottiene ca. tre secondi ...

Vorrei mettere in dubbio ciò che stai caricando nei tuoi metodi statici che devono essere rilasciati. Non consiglierei di fare queste cose in modo statico.

Detto questo, il tuo metodo statico potrebbe instanciare un oggetto che ha un metodo finalize.

Due soluzioni che mi vengono in mente:

  • Non utilizzare una classe statica. Se usi una classe non statica e la crei un'istanza, non devi preoccuparti troppo della pulizia.
  • Se questa non è un'opzione, direi che questa è una buona situazione per usare un singleton. Ciò creerà un'istanza di una copia del tuo oggetto e chiamerà il finalizzatore all'uscita, ma ti consentirà comunque di trattarlo come una classe statica per la maggior parte. Dopotutto, la tua classe è già statica e quindi condivide la maggior parte dei motivi comuni per non usare un singleton.

Portare la risposta di Michael Damatov (C #) che si basa su Herfried K. Wagner. (VB.NET) ecco la versione 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. Proprio come il metodo AppDomain.ProcessExit, questo non può essere chiamato se il processo viene terminato in modo anomalo (ad esempio da Task Manager). Un altro avvertimento è che se MyClass è generico (modello), l'assunto che il suo costruttore statico e il distruttore statico saranno chiamati non più di una volta per esecuzione dell'applicazione non sarà più valido.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top