2009-10-05 10 views
8

J'ai un enregistreur classe qui gère divers affichage de l'information avec de jolies couleurs (yay.). Cependant, comme il écrit sur la console dans étapes séparées (ie définir la couleur au rouge, écrire du texte, définir la couleur en gris, écrire du texte, pour quelque chose qui rendrait "[Erreur] Description ..." avec l'erreur étant en rouge), mais j'ai une application multithread, donc les étapes peuvent être mélangées et imprimer des choses aléatoires dans des couleurs aléatoires.Comment verrouiller la console sur des threads dans C# .NET?

Je connais le mot-clé lock, mais il ne fonctionnera pas avec une classe statique telle que la console.

Voici quelques exemples de code si j'étais pas clair:

using System; 
using System.Text; 

    namespace N.Utilities.IO 
    { 
     public static class Logger 
     { 
      private static void WriteColored(string value, ConsoleColor color) 
      { 
       if (Logger.UseColor) 
       { 
        Console.ForegroundColor = color; 
        Console.Write(value); 
        Console.ForegroundColor = ConsoleColor.Gray; 
       } 
       else 
       { 
        Console.Write(value); 
       } 
      } 

      private static void WriteLineColored(string value, ConsoleColor color) 
      { 
       if (Logger.UseColor) 
       { 
        Console.ForegroundColor = color; 
        Console.WriteLine(value); 
        Console.ForegroundColor = ConsoleColor.Gray; 
       } 
       else 
       { 
        Console.Write(value); 
       } 
      } 

      private static bool useColor = true; 

      public static bool UseColor 
      { 
       get 
       { 
        return Logger.useColor; 
       } 
       set 
       { 
        Logger.useColor = value; 
       } 
      } 

      public static void Inform(string value) 
      { 
       Logger.WriteColored(" [Info] ", ConsoleColor.White); 
       Console.WriteLine(value); 
      } 

      public static void Warn(string value) 
      { 
       Logger.WriteColored(" [Warning] ", ConsoleColor.Yellow); 
       Console.WriteLine(value); 
      } 

      public static void Error(string value) 
      { 
       Logger.WriteColored(" [Error] ", ConsoleColor.Red); 
       Console.WriteLine(value); 
      } 
    } 

Répondre

18

Vos besoins de la classe:

private static readonly object ConsoleWriterLock = new object(); 

Ensuite, vous pouvez verrouiller à ce sujet avant d'écrire à la console.

lock(ConsoleWriterLock) 
{ 
    //Your code here 
} 

Le mot-clé de verrouillage fonctionne avec une classe statique, il vous suffit de fournir un objet static readonly pour verrouiller.

+0

Merci beaucoup :) Exactement ce dont j'avais besoin. – Lazlo

+2

@jasonh Que se passe-t-il si une autre application écrit sur la console entre-temps? (qui n'utilise pas ce logger bien sûr) –

Questions connexes