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);
}
}
Muchas gracias :) Exactamente lo que necesitaba. – Lazlo
@jasonh ¿Qué sucede si otra aplicación escribe en la consola mientras tanto? (que no usa este registrador por supuesto) –