La mia comprensione di questa classe è che dovresti usarla quando vuoi essere sicuro che Finalizer (distruttore) o la classe sia chiamato, ma da un paio di test che ho fatto, non sembra essere vero. Se non si assicura che venga chiamato il metodo di smaltimento, esiste un altro modo per farlo? Ad esempio, se voglio assicurarmi che venga eseguito un codice per terminare il mio oggetto, anche se chiudo il mio programma tramite Task Manager o qualcosa del genere?(.net) CriticalFinalizerObject - Che cosa fa veramente?
risposta
da un paio di test che ho fatto, non sembra essere vero.
I finalizzatori in .Net sono non deterministici. Ciò significa che non c'è alcuna garanzia esattamente quando verrà chiamato il finalizzatore. Solo perché un oggetto è andato fuori portata o addirittura è stato eliminato, non significa che il finalizzatore verrà chiamato immediatamente. Il garbage collector si aggirerà in un momento sconosciuto in futuro.
Bene, come 20min passati e ancora non ha eseguito il codice: P –
Il garbage collector non si cura di quanto tempo è passato. Se non vengono effettuate assegnazioni, non verrà eseguito. Quindi la domanda importante è che cosa ha fatto il tuo codice durante quei 20 minuti o se il finalizzatore è stato eseguito quando sei uscito dall'applicazione. – jalf
Ho aperto l'applicazione, ctrl + alt + l'ho eliminato. –
Hmm, quindi sembra che CriticalFinalizerObject non sia quello che stavo guardando. C'è un modo in cui posso essere certo che il mio metodo Finalize sarà chiamato, anche se c'è un ctrl + alt + del? –
Se si cercano operazioni affidabili anche in caso di arresto anomalo del sistema operativo (interruzione dell'alimentazione?), È necessario esaminare l'elaborazione transazionale. –
Non ho bisogno di così tanto, ho solo bisogno di essere in grado di eseguire del codice quando l'applicazione è chiusa o ctrl + alt + del'ed. –
Se davvero necessario il codice da eseguire quando quando il programma è Ctrl + Alt + Del'd, non credo ci sia altro modo se non per avere un programma separato che controlla i primi di stato. Se hai davvero bisogno di tanta architettura, penso che vorresti usare un servizio e alcune app client, o una coppia o servizi.
Ciò presuppone, tuttavia, che abbiate già esaminato gli eventi dell'applicazione. Se non l'hai fatto, controlla this overview.
EDIT Meglio di quella panoramica, probabilmente, è lo ApplicationExit event.
Entrambi sembrano essere correlati a moduli, in questo caso si trattava in realtà di un'applicazione console. –
Il metodo Finalize()
e il metodo Dispose()
sono cose diverse.
Per impostazione predefinita, Dispose
non verrà mai chiamato. Dovresti chiamarlo tu stesso dal metodo Finalize
. Si consideri il seguente (ignorando i fallimenti evidenti in una corretta finalizzazione/smaltire modello qui, per brevità):
public class Foo : IDisposable
{
public void Dispose()
{
// NOP
}
~Foo()
{
Dispose();
}
}
Se po 'di codice potrebbe essere eseguito per terminare il vostro oggetto, quindi il Task Manager potrebbe non essere in grado di chiudere il programma. Questo è il motivo per cui il Task manager "Termina processo" interrompe il processo senza la sua collaborazione, togliendone ogni esecuzione, evitando così l'esecuzione di qualsiasi codice, pulizia o altro. –
Vorrei solo notare che la domanda dovrebbe essere modificata, o che ha identificato un problema nella comprensione OPs di smaltimento contro finalizzazione, come il metodo Finalize() e il metodo Dispose() (e paradigmi) sono completamente diversi. –