J'ai ce code qui enregistre un fichier PDF.
FileStream fs = new FileStream(SaveLocation, FileMode.Create); fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length); fs.Flush(); fs.Close();
6 Réponses :
Voici l'idéal: qui est à peu près équivalent à: p> Utilisation être plus lisible. p> Mise à jour: P> > @aron, maintenant que je pense que p> semble encore plus jolie à l'œil que l'idéal: -) p> p> p> P>
C'est un excellent exemple de l'utilisation du à l'aide de la déclaration code>, mais comme il est finalement équivalent au code de l'OP, il ne fait rien pour répondre à la question posée.
@Jeffrey, je sais que je bois beaucoup de bière, mais je ne vois vraiment pas comment cela équivaut au code OPS.
Disposez des appels proches. Fermer les appels Flush. Le résultat est le même. Votre changement est bonificial pour éviter de quitter accidentellement le fichier ouvert en cas d'exceptions ou de rendements anticipés, mais cela ne provoque pas la suppression du verrou de fichier.
équivalent dans la fonctionnalité de base. Cependant, ce code est radicalement différent dans sa manipulation de la collecte des ordures .. qui est le problème de l'OP. +1
@Chris animé - Fermer () libérera les ressources non gérées. La collection des ordures sera exactement la même dans les deux cas. Ce problème n'a rien à voir avec la collecte des ordures.
@Chris animé - Je viens de vérifier ma suspicion que l'appelant ferme () appellera également gc.surpressefinise (). La collecte des ordures est identique entre proche () et dispose ().
+1 A UTILISATEUR () N'EST PAS LA SOLUTION ICI ICI, nous avons vu ce problème même avec chaque écriture en utilisant (). Voir ma réponse pour plus de commentaires.
Jeffrey a raison. en utilisant code> ne répond pas au vrai problème, malheureusement.
Je ne peux pas imaginer pourquoi la serrure serait maintenue après la fermeture du fichier. Mais vous devriez envisager d'envelopper cela dans une déclaration d'utilisation afin de vous assurer que le fichier est fermé même si une exception est soulevée
Si les fonctions exécutées après celui-ci font partie de la même application, une meilleure approche peut être d'ouvrir le fichier à lire / écrire au début de l'ensemble du processus, puis transmettez le fichier à chaque fonction sans fermeture. jusqu'à la fin du processus. Ensuite, il sera inutile que l'application empêche l'attente de l'opération IO complète. P>
Nous avons vu ce même problème dans la production avec une déclaration en utilisant () l'enveloppant. p>
L'un des meilleurs coupables ici est un logiciel antivirus qui peut s'enfoncer une fois le fichier fermé, saisissez-le pour vérifier qu'il ne contient pas de virus avant de le libérer. P>
Mais même avec tous les logiciels anti-virus hors du mélange, dans des systèmes de charge très élevés avec des fichiers stockés sur des actions réseau, nous avons toujours vu le problème de temps en temps. A, toux, fil court.sleep (), toux, après la fermeture semblait la guérir. Si quelqu'un a une meilleure solution, j'aimerais l'entendre! P>
Difficile de recommander une valeur spécifique car elle dépendra de nombreux facteurs; Commencez petit, dites 10.
Cela a fonctionné pour moi lors de l'utilisation .Funshush () Je devais ajouter une fermeture à l'intérieur de l'instruction Utilisation.
using (var imageFile = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite,FileShare.ReadWrite)) { imageFile.Write(bytes, 0, bytes.Length); imageFile.Flush(); imageFile.Close(); }
Je devais faire la même chose lorsque j'utilise Whiteasync code> Intérieur
en utilisant code> aussi.
Il suffit d'avoir le même problème lorsque j'ai fermé un filtream et a ouvert le fichier immédiatement dans une autre classe. L'utilisation de l'utilisation n'était pas une solution car les filtres ont été créés sur un autre endroit et stockés dans une liste. Effacement de la liste n'était pas suffisant.
On dirait que le flux doit être libéré par le collecteur des ordures avant que le fichier puisse être réutilisé. Si le temps entre la fermeture et l'ouverture est trop court, vous pouvez utiliser p> juste après la fermeture du flux. Cela a fonctionné pour moi. P> Je suppose que les solutions d'Ian Mercer à mettre le fil au sommeil peuvent avoir le même effet, donnant ainsi à la Temps GC pour libérer les ressources. P> P>
Le fichier est-il sur un disque dur local ou une part de réseau? Avez-vous un logiciel antivirus installé?