Question

Supposons que vous ayez un fichier que vous les informations de journalisation en programme en ce qui concerne un processus. Un peu comme votre Console.WriteLine de débogage typique, mais en raison de la nature du code que vous testez, vous ne disposez pas d'une console d'écrire sur de sorte que vous devez écrire quelque part comme un fichier. Mon programme actuel utilise System.IO.StreamWriter pour cette tâche.

Ma question porte sur l'approche à l'utilisation du StreamWriter. Est-il préférable d'ouvrir une seule instance de StreamWriter, faire toutes les écritures, et la fermer quand l'ensemble du processus se fait? Ou est-il une meilleure idée d'ouvrir une nouvelle instance StreamWriter pour écrire une ligne dans le fichier, puis fermez immédiatement, et le faire pour chaque fois que les besoins de quelque chose à écrire dans? Dans cette dernière approche, ce serait probablement facilitée par une méthode qui ferait juste que pour un message donné, plutôt que ballonnements le principal code de traitement avec des quantités excessives de lignes. Mais avoir une méthode pour aider à cette mise en œuvre ne rend pas nécessairement le meilleur choix. Y at-il des avantages significatifs à choisir l'une ou l'autre approche? Ou sont-ils fonctionnellement équivalents, en laissant le choix sur les épaules du programmeur?

Était-ce utile?

La solution

Ouverture répétée / fermeture d'une nouvelle StreamWriter pour chaque écriture va générer beaucoup de ressources pour le GC ainsi que d'imposer les frais généraux sur l'application en raison de la recherche réelle du fichier pour chaque opération d'ouverture. D'autre part, la tenue d'une seule ouverture de flux tiendra un verrou sur le fichier. Donc, cela dépend.

Vous ne voulez pas que votre mécanisme de journalisation pour devenir un goulot d'étranglement, donc écrire à un seul flux. Faites-unbuffered ou AutoFlush pour le débogage critique (mais sachez, qui a aussi un impact sur les performances).

Je suivre le modèle de log4net, créer un flux de journal statique et écriture à ce singleton. Regardez dans log4net de toute façon, donc vous ne pas rouler votre propre. http://logging.apache.org/log4net/index.html

Autres conseils

Regardez les implémentations de l'exploitation forestière pré-laminée; ils peuvent vous faire économiser beaucoup de maux de tête. De toute évidence, en gardant les moyens ouverts flux que vous risquez de perdre certaines des données de fin si elle se bloque, mais peut Gaing les performances de mise en mémoire tampon IO plus. Certaines mises en œuvre peuvent également offrir des fonctionnalités telles que l'enregistrement asynchrone à partir d'une bobineuse / file d'attente.

Je tampon / file d'attente les données et écrire dans le fichier une fois qu'il atteint un seuil et vider la file d'attente tout lorsque l'application se ferme / sorties normalement.

La seule question en litige est dans le cas d'un plantage de l'application, vous risquez de perdre les éléments de la file d'attente ...

HTH.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top