¿Hay vida después del Trace?


A los programadores nos suele gustar mucho escribir en la consola lo que están haciendo nuestras funciones.
Algunas veces es porque simplemente nos gusta ver que el interior funciona, como cuando abríamos un coche de scalextric o desmontábamos un reloj, pero normalmente es para saber qué está ocurriendo dentro del código sin hacer interminables sesiones de debug.
Cuando la programamos con múltiples hilos, eventos y cientos de controles, poner puntos de debug se vuelve una auténtica locura. Unas pocas líneas llamando a métodos de la clase System.Diagnostics.Trace nos pueden ayudar mucho. Pero, ¿qué pasa cuando no tenemos enganchado el debugger del VS.Net?, ¿adónde van los mensajes de Trace?
El mejor amigo del programador es aquí la clase System.Diagnostics.TraceListener. Heredando de ella podemos crear fácilmente nuestra propia ventana de Trace sin necesidad de tener un debugger para poder verlos. Simplemente hemos de implementar dos métodos que escriban en nuestra ventana:

He aquí una muestra de código, os dejo para vosotros la implementación de la TraceWindow:

/// <summary>
///
Trace Listener que dirige el trace a una ventana.
///
</summary>
public class WindowTraceListener :
TraceListener
{

private TraceWindow traceWin;

/// <summary>
///
Crea una instancia de WindowTraceListenerClass
///
</summary>
public WindowTraceListener() : base()
{
ShowTraceWindow();
}

/// <summary>
///
Abre la ventana de Trace.
///
</summary>
public void ShowTraceWindow()
{
ThreadPool.QueueUserWorkItem(
new WaitCallback(ShowTraceWindowInThread));
}

/// <summary>
///
Inicializa una nueva instancia de la clase WindowTraceListener
///
usando el nombre espcificado.
///
</summary>
/// <param name=”name”>nombre para el listener.
</param>
public WindowTraceListener(string name) : base(name)
{
ShowTraceWindow();
}

// ejecuta la ventana en otro thread para evitar atascar nuestra aplicacion
private void ShowTraceWindowInThread(object o)
{
if (traceWin == null)
{
traceWin = new TraceWindow();
traceWin.FormClosed += new FormClosedEventHandler(traceWin_FormClosed);
traceWin.ShowDialog();
}
}

void traceWin_FormClosed(object sender, FormClosedEventArgs e)
{
traceWin.Dispose();
traceWin = null;
}

/// <summary>
///
Escribe un mensaje a la ventana TraceWindow.
///
</summary>
/// <param name=”message”>el mensaje a escribir.
</param>
public override void Write(string message)
{
traceWin.Write(message);
}

/// <summary>
///
Escribe un mensaje a la ventana TraceWindow.
///
</summary>
/// <param name=”message”>el mensaje a escribir.
</param>
public override void WriteLine(string message)
{
traceWin.WriteLine(message);
}

}

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s