2009-10-05 17 views
8

Mam klasę logger, która obsługuje wyświetlanie różnych informacji w pięknych kolorach (yay.). Ponieważ jednak zapisuje na konsolę w , oddzieliłem kroki (tj. Ustawiono kolor na czerwony, pisz tekst, ustaw kolor na szary, pisz tekst, dla czegoś, co renderowałoby "[Błąd] Opis ..." z błędem będącym na czerwono), ale mam aplikację wielowątkową, więc kroki mogą się pomieszać i wydrukować losowe rzeczy w przypadkowych kolorach.Jak zablokować konsolę dla wątków w C# .NET?

Jestem świadomy słowa kluczowego lock, jednak nie będzie działać z klasą statyczną, taką jak konsola.

Oto przykład kodu gdybym była niejasna:

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); 
      } 
    } 

Odpowiedz

18

klasie potrzeby:

private static readonly object ConsoleWriterLock = new object(); 

Następnie można zablokować na ten temat przed napisaniem do konsoli.

lock(ConsoleWriterLock) 
{ 
    //Your code here 
} 

Słowo kluczowe blokada będzie działać z klasą statyczną, wystarczy, aby zapewnić static readonly obiekt do blokady.

+0

Wielkie dzięki: Dokładnie to, czego potrzebowałem. – Lazlo

+2

@jasonh Co, jeśli inna aplikacja zapisuje do konsoli w międzyczasie? (które oczywiście nie używa tego rejestratora) –

Powiązane problemy