2009-11-23 5 views
0

J'ai une classe qui représente un document (GH_Document). GH_Document a une méthode d'enregistrement automatique qui est appelée avant chaque opération potentiellement dangereuse. Cette méthode crée (ou remplace) un fichier AutoSave à côté du fichier d'origine.C# AutoSave cleanup; meilleur entrainement?

GH_Document contient également une méthode appelée DestroyAutoSaveFiles() qui supprime tous les fichiers du disque qui ont été créés par la fonction AutoSave. J'appelle cette méthode sur les documents lorsque l'application se ferme, et aussi lorsque les documents sont déchargés. Cependant, il semble que j'ai manqué quelques cas puisque les fichiers AutoSave sont toujours présents après quelques arrêts réussis.

Donc, cela m'a fait réfléchir. Quelle est la meilleure façon de gérer des situations comme celle-ci? Dois-je repérer toutes les manières possibles de supprimer des documents et ajouter une logique de nettoyage automatique? Ou devrais-je implémenter IDisposable et effectuer un nettoyage dans GH_Document.Dispose()? Ou devrais-je le faire dans GH_Document.Finalize()?

La seule fois où je veux qu'un fichier de sauvegarde automatique reste sur le disque, c'est que l'application plante. Dispose et Finalize sont-ils garantis pour ne pas être appelés en cas de crash?

Répondre

1

Dispose et Finalize est-il garanti de ne pas être appelé en cas de panne?

En général, non, bien que cela dépende de la façon dont votre application se bloque. En C#, il s'agira généralement d'une exception non interceptée se propageant jusqu'au niveau supérieur. Dans ce cas, toutes les clauses finally seront exécutées lors de la remontée de la pile, ce qui inclut les appels Dispose d'utilisation des instructions.

Si l'application est interrompue soudainement (par exemple en la supprimant dans le Gestionnaire des tâches), les clauses finally ne seront pas appelées, mais vous ne devriez pas vous fier à ce comportement.

Une solution simple consiste à placer vos fichiers de sauvegarde automatique dans un répertoire caché avec une convention de dénomination spéciale et à supprimer tous les fichiers enregistrés automatiquement dans ce répertoire lors de l'arrêt réussi.

+0

Merci Mark, qui exclut à peu près l'approche Finalize. Mon application s'exécute en tant que plug-in géré dans un environnement non géré et la plupart des plantages se produisent en raison d'exceptions C++ non gérées, de débordements de mémoire ou d'exceptions gérées entraînant le blocage de l'application de base. Je ne peux pas détruire TOUS les fichiers d'enregistrement automatique, car les utilisateurs peuvent exécuter plusieurs instances de mon application, et une instance ne doit pas supprimer les fichiers d'enregistrement automatique d'une autre. De plus, les gens ne pourront pas trouver ce dossier 'spécial', cela mettrait un fardeau supplémentaire sur le support. Je pense que je vais juste devoir rendre le nettoyage étanche. –

Questions connexes