Ma compréhension de cette classe est que vous devez l'utiliser lorsque vous souhaitez être sûr que le finaliseur (destructeur) de la classe est appelé, mais à partir de quelques tests que j'ai fait, cela ne semble pas être vrai. Si cela ne s'assure pas que la méthode d'élimination est appelée, y a-t-il une autre façon de le faire? Par exemple, si je veux vous assurer que le code est exécuté pour mettre fin à mon objet, même si je ferme mon programme via un gestionnaire de tâches ou quelque chose? P>
4 Réponses :
d'un couple de tests que j'ai fait, il ne semble pas être vrai. p> blockQuote>
Les finaliseurs de .net sont non déterministes. em> Cela signifie qu'il n'y a aucune garantie exactement quand em> le finaliseur sera appelé. Ce n'est pas parce qu'un objet est sorti de la portée ou même a été disposé, cela ne signifie pas que le finaliseur sera appelé tout de suite. Le collecteur des ordures se mettra à un moment inconnu à l'avenir. P>
Eh bien, comme 20min passa et il n'a toujours pas exécuté le code: P
Le collecteur des ordures ne se soucie pas du temps passé. Si aucune allocations n'est faite, elle ne fonctionnera pas. La question importante est donc ce que votre code a fait pendant ces 20 minutes - ou si le finaliseur a couru lorsque vous avez quitté l'application.
J'ai ouvert l'application, Ctrl + Alt + Suppr +.
En fait, je le ferai simplement la refermée (maintenant que j'y pense), cliqué sur le X sur une demande de console.
Hmm, il semble donc que CriticalizinalisateObject n'est pas ce que je cherchais. Est-ce que je peux être certain que ma méthode de finalisation sera appelée, même s'il y a une Ctrl + Alt + Suppr?
Si vous recherchez des opérations fiables, même si le système d'exploitation se bloque (panne de courant?), Vous devez alors examiner le traitement transactionnel.
Je n'ai pas besoin de cela, je n'ai besoin que de pouvoir exécuter du code lorsque l'application est fermée ou CTRL + Alt + Del'ed.
"Le processus final" met fin au processus. Tout ce que vous vouliez courir, il est trop tard.
Est-ce toujours vrai pour .NET 4.0?
Quelqu'un pourrait-il éditer la question de mettre à jour le lien ou de poster le sujet complet, s'il vous plaît (je n'ai pas pu trouver le sujet, je ne peux donc pas la mettre à jour moi-même)? Sinon, la réponse est sans usage.
Si vous Cela suppose que vous avez déjà examiné les événements de l'application. Si vous ne l'avez pas fait, consultez Cet aperçu . < / p>
Les deux semblent être liés aux formes, dans ce cas, c'était en réalité une demande de console.
Le Par défaut, finaliser () code> méthode et
Dispose () code> La méthode est différente.
Dispose code> ne serait jamais appelé. Vous devriez vous appeler vous-même à partir de la méthode code> finaliser code>. Considérez ce qui suit (ignorant les échecs évidents dans un modèle de finalisation / élimination approprié ici, pour la brièveté): p>
Si un code pouvait être exécuté pour mettre fin à votre objet, le gestionnaire de tâches pourrait être incapable de fermer votre programme. C'est pourquoi le responsable de la tâche 'Fin Process' arrête votre processus sans sa coopération en prenant toute l'exécution de celui-ci, empêchant ainsi la course de tout code, nettoyage ou autrement.
Je noterais seulement que la question devrait être éditée ou qu'il a identifié un problème dans la compréhension des opérations de l'élimination par rapport à la finalisation, la méthode finalisée () et disposer () méthode (et paradigmes) sont complètement différentes.