2009-10-05 22 views
8

Tengo una clase de registrador que maneja varias pantallas de información con colores bonitos (yay.). Sin embargo, dado que escribe en la consola en pasos separados (es decir, establece el color en rojo, escribe texto, establece el color en gris, escribe texto, para algo que mostraría "[Error] Descripción ..." con el error en rojo), pero tengo una aplicación multiproceso, por lo que los pasos pueden mezclarse e imprimir cosas aleatorias en colores aleatorios.¿Cómo bloqueo la consola entre subprocesos en C# .NET?

Soy consciente de la palabra clave lock, sin embargo, no funcionará con una clase estática como la consola.

Aquí es un código de ejemplo si estaba claro:

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

Respuesta

18

Sus necesidades de la clase:

private static readonly object ConsoleWriterLock = new object(); 

Entonces se puede bloquear en este antes de escribir en la consola.

lock(ConsoleWriterLock) 
{ 
    //Your code here 
} 

La expresión lock trabajará con una clase estática, sólo tiene que proporcionar un objeto static readonly para bloquear sucesivamente.

+0

Muchas gracias :) Exactamente lo que necesitaba. – Lazlo

+2

@jasonh ¿Qué sucede si otra aplicación escribe en la consola mientras tanto? (que no usa este registrador por supuesto) –

Cuestiones relacionadas