2011-03-20 12 views
5

Tengo un programa de consola, me gustaría reflejar continuamente el resultado de Console.Write en una colección, que puedo ver en la cola en tiempo real. La colección podría ser una matriz, una lista, etc.¿Hay alguna manera de reflejar continuamente el resultado de Console.Write en una colección (matriz, lista, etc.)?

Supongo que tendré que usar algún tipo de controlador de eventos?

No me importa que mi dirección sea una biblioteca de terceros, p. Ej. NLog.

actualización

que necesito para mantener una colección en la memoria, lo que refleja el estado actual de la consola (que luego se puede enviar a una aplicación Windows Forms remotos usando sockets). Dejando a un lado los detalles, creo que puedo hacer esto con unas pocas líneas de C# - No quiero agregar una gran biblioteca de registro sin una buena necesidad.

Respuesta

5

La clase de consola le permite reemplazar la salida y las secuencias de error. Justo lo que necesita aquí, puede reemplazarlos con un TextWriter que también registra lo que está escrito. Un ejemplo de implementación:

class ConsoleLogger : System.IO.TextWriter { 
     private System.IO.TextWriter oldOut; 
     private Queue<string> log = new Queue<string>(); 
     private StringBuilder line = new StringBuilder(); 
     private object locker = new object(); 
     private int newline; 
     private int logmax; 

     public ConsoleLogger(int history) { 
      logmax = history; 
      oldOut = Console.Out; 
      Console.SetOut(this); 
     } 
     public override Encoding Encoding { 
      get { return oldOut.Encoding; } 
     } 
     public override void Write(char value) { 
      oldOut.Write(value); 
      lock (locker) { 
       if (value == '\r') newline++; 
       else if (value == '\n') { 
        log.Enqueue(line.ToString()); 
        if (log.Count > logmax) log.Dequeue(); 
        line.Length = newline = 0; 
       } 
       else { 
        for (; newline > 0; newline--) line.Append('\r'); 
        line.Append(value); 
       } 
      } 
     } 
    } 

Uso:

static void Main(string[] args) { 
     var outLogger = new ConsoleLogger(100); 
     // etc... 
    } 
1

Usted puede crear un método de ayuda sencillo y que en lugar de llamar a Console.Write.

private void WriteToConsole(string message) 
{ 
    myList.Add(message); 

    Console.Write(message); 
} 
+0

Ok, eso es factible. Sin embargo, prefiero no cambiar la aplicación de consola existente, y esto creará problemas cuando haya múltiples parámetros para Console.Write(). – Contango

2

Probablemente se podría escribir una nueva TextWriter que es Write llamadas rellenar una lista en lugar de escribir a un arroyo. Debería configurar esto a través de Console.SetOut(...)

2

Utilizando Console.SetOut puede configurar su TextWriter personalizado.

1

Si desea escribir un código como:

WriteToConsole("{0} tel is: {1:+### ### ### ###}", "Name", 242352356578); 

Entonces usted podría tener código:

private static Queue<String> q = new Queue<String>(1000); 
    private static void WriteToConsole(String message) 
    { 
     q.Enqueue(message); 
     Console.Write(message); 
    } 
    private static void WriteToConsole(String message, params Object[] r) 
    { 
     String s = String.Format(message, r); 
     q.Enqueue(s); 
     Console.Write(s); 
    } 
Cuestiones relacionadas