10
votes

C # en utilisant Idisposable pour nettoyer les fichiers temporaires

J'ai une classe FILEUPLOADER qui peut éventuellement recevoir un fichier ZIP qu'il extrait à un emplacement temporaire et renvoie les chemins de fichiers.

de ce que j'ai compris, implémentant l'interface Idisposable sur le Classe FileUploader et à l'aide de la méthode Dispose pour supprimer tous les fichiers temporaires rendrait la classe se nettoyer dès que sa référence est tombée hors contexte?

Ce n'est pas ce qui ne semble pas être le cas Cependant, quelqu'un peut-il expliquer comment je pourrais aller sur ce que je suis en train d'essayer d'atteindre?

mise à jour

Pour clarifier, mon code est le suivant: xxx

im tente d'obtenir le fichier fichier pour supprimer tous les fichiers temporaires après la méthode ImportsFile () terminée


2 commentaires

Pouvez-vous nous dire ce que FileduPloader fait et comment il se rapporte à décompresser? Je pourrais fournir un exemple zipextractter en tant que Idisposable , mais cela ne couvrirait probablement pas la vraie utilisation complètement ..


Fileduploader Accepte simplement un fichier de formulaire publié et renvoie l'emplacement physique du fichier Temp chargé. Toutefois, si le fichier posté est un fichier zip, il l'extrait et renvoie tous les emplacements des fichiers temporaires extraits.


7 Réponses :


8
votes

"est tombé hors contexte" n'est pas clair; Vous devriez faire: xxx

sans en utilisant , il n'y a pas de manipulation spéciale. Ceci est ensuite traduit par le compilateur en quelque chose comme: xxx

et il est ce qui provoque le nettoyage déterministe.


0 commentaires

2
votes

Dispose code> n'est automatique que si vous enveloppez le contexte avec le à l'aide du mot-clé CODE>:

using (FileUploader uploader = new FileUploader(...))
    uploader.UploadFiles();


0 commentaires

0
votes

Comme d'autres personnes ont déjà dit, Dispose n'est pas appelé automatiquement à moins que le contexte soit enveloppé avec le mot-clé . Vous pouvez toutefois mettre en œuvre à la fois les modèles d'élimination et de finalisation (appelez le Disposer à partir d'un finaliseur / destructeur). De cette façon, vous avez un sans danger d'échec et supprime vos fichiers temporaires, même si votre code n'appelle pas Dispose directement (car le collecteur des ordures appellera finalement).

Cet article illustre le concept, ainsi que de donner des idées sur la manière dont Finalisation fonctionne.


4 commentaires

Cela étant dit, je pense que l'approche la plus propre serait d'utiliser un bloc d'utilisation autour de votre fichier FileduLoader.


Donc, le Dispose sera éventuellement appelé sur cet objet? La raison pour laquelle je demande est parce que je n'en teniez pas vraiment lorsque les fichiers temporaires sont supprimés, tant qu'ils sont finalement supprimés :)


Il y a des circonstances exceptionnelles lorsqu'un finaliseur ne sera pas appelé par le temps d'exécution, mais vous pouvez en général vous attendre à ce qu'il fonctionne à un peu de temps inconnu après la sortie de l'objet.


Voir MSDN.MICROSOFT.COM/EN-US/ Bibliothèque / B1YFKH5E (v = vs.100) .aspx pour un exemple.



1
votes

Vous pouvez implémenter les finaliseurs de sorte que si vous oubliez d'appeler disposer (que vous ne devez vraiment pas!) et appelez le Disposer dans votre finisseur. Ce sera appelé lorsque l'objet est en train d'être des ordures recueillies - mais c'est indéterminé, c'est-à-dire. Pas moyen de le savoir quand il sera appelé.

Mais c'est pas garanti .


0 commentaires

0
votes

Comme tout le monde dit, votre meilleur pari est de l'envelopper dans une déclaration avec l'utilisation de la méthode d'élimination. Je pense que c'est ainsi que Microsoft recueille pour utiliser tout ce qui implémente Idisose, au moins basé sur leurs règles d'analyse de code.


0 commentaires

7
votes

Vous devrez mettre en œuvre correctement Idisposable. Comme la classe ci-dessous.

using(TempStorage myStorage = new TempStorage("C:\temp")
{
    // rest of the main method here...
}


1 commentaires

S'il n'y a pas de ressources non gérées, il n'est pas nécessaire de mettre en œuvre le modèle d'élimination. Il suffit d'utiliser la méthode Disposer pour supprimer le fichier temporaire.



0
votes

Idisposable est approprié dans les cas où un objet change quelque chose en dehors de lui-même de manière à être nettoyé à un moment donné avant que l'objet ne disparaisse. La création de fichiers temporaires semblerait être admissible. Il y a cependant un couple de mises en garde:

  1. Malheureusement, il n'y a pas de sens agréable pour un élimination pour déterminer si une exception est en attente lorsqu'elle s'exécute. Si j'avais mes druthers, il y aurait une interface IDISPEADEX qui hériterait d'Idisposable, mais également de mettre en œuvre une surcharge (ex exception); Cela se comporterait comme Idisposable, sauf que EX serait transmis comme une exception à toute exception que l'Idisposable elle-même pourrait lancer. Comme c'est le cas, rien de tel existe. On peut donc souvent faire face au choix inconfortable d'avaler une exception qui se produit lors de l'élimination ou d'enterrer une exception survenue avant de disposer (et peut avoir prédiqué la disposition en premier lieu). Les deux choix puantent.
  2. Les finaliseurs doivent éviter de faire tout ce qui pourrait bloquer ou jeter une exception. Pour quelque chose comme le nettoyage de fichiers, il peut être utile d'avoir un fil de nettoyage de fichier (pour un groupe de classes, pas un par objet!) Qui attend un finisseur de lui donner un signal, puis nettoie les fichiers. Si une tentative de nettoyage des blocs de fichiers, le thread de nettoyage de fichier peut être bloqué, mais il ne voudrait pas Jinx toute l'application.

    Je n'aime pas particulièrement les finaliseurs; L'accent devrait être mis sur la fabrication du débarras.


0 commentaires