StreamWriter : Exception que je ne comprends pas... - C#/.NET managed - Programmation
Marsh Posté le 03-11-2005 à 17:02:21
Personne n'a une idée ? Parceque là, ça me lourde en fait
Marsh Posté le 04-11-2005 à 00:31:17
c'est une race condition sur les I/O bufferisées. ça m'est déjà arrivé, et un gars de chez Microsoft m'avait répondu que ça venait du fait que les I/O bufferisées n'étaient pas thread safe, en étant toutefois très évasif
essaie ceci :
Code :
|
Marsh Posté le 04-11-2005 à 09:07:38
OK, j'avais contourné le problème en ouvrant et fermant le fichier à chaque ligne. D'un côté c'est pourri, et d'un autre, pour un log c'est pas plus mal : si l'appli plante pour de bon, j'ai trace dans le log jusqu'au dernier élément logué, alors que sinon je perds tout le buffer avec.
Donc pour cette appli, je laisse comme ça. Par contre, je vais en avoir besoin pour générer un fichier de données dans une autre appli, je garde le topic en favori du coup. Merci !
Sinon, chose étonnante : mon appli n'est pas multithreadée pourtant. Sur un forum, j'avais en effet vu une explication similaire à la tienne, comme quoi c'est un bug du framework : StreamWriter et StreamReader sont indiqués comme thread-safe dans la doc, et pourtant ils ne le sont pas réellement. Seulement, ça ne devrait pas s'appliquer à mon cas, puisque mon appli est mono-thread
Marsh Posté le 04-11-2005 à 15:17:49
Je fais pareil avec mes logs : ouverture/fermeture à chaque fois, je fais ça depuis des années et ça marche bien.
Pour le bug : j'ai des trucs qui ressemblent de tps en tps (enfin je crois, j'ai le framework en anglais : c'est pas le même message )
Je pense que c'est dû au fait que l'écriture sur fichier n'est pas synchrone, et que le StreamWriter est mal codé.
Un idée ça peut être d'utiliser Flush() sur le stream entre les écriture, pour forcer l'écriture physique...
Marsh Posté le 04-11-2005 à 15:43:26
yep en effet.
mais mon problème, c'est que je vais bientôt devoir écrire un prog qui génère un fichier d'intégration de plusieurs centaines de milliers de lignes, et ce, assez souvent
et le but, c'est donc d'éviter d'ouvrir/fermer le fichier à chaque ligne, ni même de flusher, là je vais avoir un buffer de 1 Mo et je compte bien écrire sur le HD par lots de 1 Mo, d'autant plus que le disque est déjà extrêment stressé par l'activité di serveur
Marsh Posté le 04-11-2005 à 15:53:21
Si tu veux éviter ce pb, fait ton propre système de bufferisation.
Un bête ArrayList
Marsh Posté le 04-11-2005 à 16:21:08
ben ouais, je sens que je vais devoir bidouiller...
sinon, un truc...
.NET ne supporte pas les record ?
j'entends par là écrire une structure d'un coup dans un fichier (et savoir la relire)
par exemple, en VB je faisais ça (l'équivalent marche aussi en ADA, langage sur lequel j'ai appris cette technique) :
Code :
|
ce qui donne dans le fichier :
|
Et ensuite, je peux relire ce fichier avec des "get fil cde" par exemple, ce qui va allimenter ma variable de type "commande" avec les données contenue dans le fichier.
J'ai cru comprendre que C# ne supportait même pas les chaines de taille fixe !
ps: ici, je ne gère que des string, mais on peut aussi stocker des types tels que INT, DATE, ou autres... y'a juste que passer par des chaines rend lisible le fichier pour analyse manuelle (parceque si j'ai une date en binaire dans mon fichier, je vais avoir un mal de chien à la relire )
Marsh Posté le 03-11-2005 à 16:31:56
Salut,
J'ai un programme en mode Console.
Dedans, j'ai une classe "logFile" dont voici le contruteur et la méthode qui pante :
Lorsque je lance le programme, ça plante avec ce message :
Voici le fichier qu'il a commencé à écrire :
Ca plante sur cet appel (log est une instance de la classe logFile) :
Pourquoi ça plante ???
Message édité par Arjuna le 03-11-2005 à 16:39:16