Skip to content

Instantly share code, notes, and snippets.

@smailliwcs
Created September 22, 2020 15:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save smailliwcs/eaf3ae5a4ade672ac73a8d3f6876a8d6 to your computer and use it in GitHub Desktop.
Save smailliwcs/eaf3ae5a4ade672ac73a8d3f6876a8d6 to your computer and use it in GitHub Desktop.
Buffering a TraceListener
using System;
using System.Diagnostics;
using System.Text;
using System.Threading;
public class BufferedTraceListener : TraceListener
{
private SynchronizationContext context;
private StringBuilder buffer;
private object bufferLock;
private Timer timer;
private TimeSpan delay;
public BufferedTraceListener(TimeSpan delay)
{
context = SynchronizationContext.Current;
buffer = new StringBuilder();
bufferLock = new object();
timer = new Timer(Tick);
this.delay = delay;
}
public BufferedTraceListener()
: this(TimeSpan.FromSeconds(0.1)) { }
public event EventHandler<TraceEventArgs> Written;
private void OnWritten(TraceEventArgs e)
{
if (context == null)
{
Written?.Invoke(this, e);
}
else
{
context.Post(state => Written?.Invoke(this, e), null);
}
}
private void OnWritten(string message)
{
OnWritten(new TraceEventArgs(message));
}
private void Tick(object state)
{
lock (bufferLock)
{
OnWritten(buffer.ToString());
buffer.Clear();
}
}
public override void Write(string message)
{
lock (bufferLock)
{
buffer.Append(message);
timer.Change(delay, Timeout.InfiniteTimeSpan);
}
}
public override void WriteLine(string message)
{
Write(message + Environment.NewLine);
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing)
{
timer.Dispose();
}
}
}
using System;
public class TraceEventArgs : EventArgs
{
public string Message { get; private set; }
public TraceEventArgs(string message)
{
Message = message;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment