Bonjour à tous,

J'ai un petit problème lors de l'écriture dans un fichier de log. Plusieurs Thread accèdent au même fichier via une variable statique maintenue dans une Th principal (Core) chargé de lancé les autres threads.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
public static LogFile Log;
La classe LogFile possède la méthode suivante
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 
/// <summary>
        /// Ecrit une ligne de texte précédée de la date et heure correspondant 
        /// au format définit dans le fichier de configuration.
        /// </summary>
        /// <param name="textLine">Ligne de texte a écrire dans le fichier log</param>
        public void WriteLog(String textLine)
        {
            try
            {
                Monitor.TryEnter(_lock);
                //Si le jour a changé, alors on change de fichier
                if (_currDate != GetDateFormat())
                {
                    //Fermeture du flux précédent (ouvert)
                    _sw.Close();
 
                    //Création du chemin du fichier
                    _currDate = GetDateFormat();
                    _fi = new FileInfo(String.Format(@"{0}\{1}{2}", _basedir.FullName, _currDate, _config["FileExtension"].ToString()));
 
                    //Ouverture du fichier
                    _sw = new StreamWriter(new FileStream(_fi.FullName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite));                   
 
                    //Avertissement console d'un changement de fichier
                    Console.WriteLine("\tLogfile: Changement de fichier log: {0}", _fi.FullName);
                }
                String buffer = String.Format("{0} - {1}", DateTime.Now.ToString(_config["LineTimeFormat"].ToString()), textLine);
 
                //Ecriture dans le fichier
                _sw.WriteLine(buffer);
                _sw.Flush();
 
                Monitor.Exit(_lock);
            }
            catch (IOException e)
            {
                Console.WriteLine("\tLogFile: Erreur d'écriture {0}",e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("\tLogFile: Erreur d'écriture critique {0}",e.Message);
            }
        }
 
        /// <summary>
        /// Retourne la date au format Spécifié dans le fichier de config (FileTimeFormat)
        /// </summary>
        /// <returns></returns>
        private String GetDateFormat()
        {
            return DateTime.Now.ToString(_config["FileTimeFormat"].ToString());
        }
Chaque soir à minuit, la date change donc le code passe dans le if, et je me prend systématiquement un passage dans Catch(Exception e) avec pour message d'erreur
Impossible d'écrire dans un TextWriter fermé.
Cela semble dire que malgrés le monitor, deux theads accèdent au code placé entre le TryEnter() et le Exit().