finalizzatori può effettivamente essere mai eseguito, come Raymond Chen explains. Un po 'strano che questa domanda viene chiesto durante la settimana annuale CLR, appena due giorni dopo aver spiegato :)
Per i più pigri, la (o meglio, uno) conclusione è:
Un correttamente - il programma scritto non può presumere che i finalizzatori verranno mai eseguiti.
Se ti stai chiedendo se puoi contare sui finalizzatori, questo è già tutto quello che devi sapere: non fare affidamento sui finalizzatori.
Come Raymond Chen afferma anche nel articolo collegato:
finalizzatori sono una rete di sicurezza, non è un mezzo primario per la bonifica delle risorse.
Se stai cercando come liberare risorse, dai un'occhiata al modello monouso.
un finalizzatore potrebbe non funzionare, per esempio, se:
- Un altro finalizzatore genera un'eccezione.
- Un altro finalizzatore richiede più di 2 secondi.
- Tutti i finalizzatori insieme richiedono più di 40 secondi.
- Un AppDomain blocca o viene scaricato (anche se è possibile aggirare questo con un finalizzatore critico (CriticalFinalizerObject, SafeHandle o qualcosa di simile)
- No garbage collection si verifica
- Il processo si blocca
(Nota: I valori temporali possono essere cambiati nel tempo, but were certainly true some time ago.)
Immagino che ci siano molte più cose che possono far sì che i finalizzatori non vengano mai eseguiti.La linea di fondo è, oltre alla citazione di Chen, che i finalizzatori sono un rete di sicurezza th a diminuire l'impatto dei bug, perché ad esempio le risorse vengono rilasciate a volte, che è meglio di mai, se si dimentica di farlo in modo esplicito.
Puoi citare di più delle parti importanti? E sì, forse il richiedente non vedeva l'ora di trovare esattamente quel collegamento. ;) – mafu
In realtà, dal momento che molte persone chiedono come possono fare affidamento sul comportamento del finalizzatore, penso che * * abbia * citato la singola parte più importante;) D'altra parte, anche le altre caselle nell'articolo potrebbero essere interessanti. – OregonGhost
@OregonGhost: Sto comprendendo questo diritto: se 20 finalizzatori prendono ciascuno 1,95 secondi ciascuno, questo è hunky dory e tutto verrà eseguito - impiegando 39 secondi. Se uno prende 2,05 secondi, l'esecuzione di tutti gli altri viene saltata. Sembra piuttosto rotto. Piuttosto bruscamente interrompendo un finalizzatore che richiede più di 2 secondi, allo scopo di consentire ad altri di funzionare per il resto del timeout di 40 secondi, sarebbe una buona caratteristica. Ma le cose che scombussolano dopo due secondi sembrerebbero una disfunzione. – supercat