📄 queuetracelistener.cs
字号:
#region Copyright ArtfulBits Inc. 2005 - 2008
//
// Copyright ArtfulBits Inc. 2005 - 2008. All rights reserved.
//
// Use of this code is subject to the terms of our license.
// A copy of the current license can be obtained at any time by e-mailing
// info@artfulbits.com. Re-distribution in any form is strictly
// prohibited. Any infringement will be prosecuted under applicable laws.
//
#endregion
#region File usings
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
#endregion
namespace Artfulbits.Utilities.Diagnostics
{
/// <summary>
///
/// </summary>
public class QueueTraceListener : TraceListener
{
#region Class constants
/// <summary></summary>
public const int MaxMessages = 1000;
/// <summary></summary>
private static readonly string NewLine = Environment.NewLine;
#endregion
#region Members
/// <summary></summary>
private readonly LinkedList<string> m_messages = new LinkedList<string>();
#endregion
#region Class events
/// <summary></summary>
public event EventHandler<EventArgs<string>> OnWriteLine;
#endregion
#region Public properties
/// <summary>
///
/// </summary>
public LinkedList<string> Messages
{
get
{
return m_messages;
}
}
#endregion
#region Class construction
/// <summary>
///
/// </summary>
public QueueTraceListener()
{
// add first empty string into queue
m_messages.AddLast( string.Empty );
}
#endregion
#region Class overrides
/// <summary>
///
/// </summary>
/// <param name="message"></param>
public override void Write( string message )
{
lock( m_messages )
{
string[] lines = message.Split( new string[]{ NewLine }, StringSplitOptions.RemoveEmptyEntries );
LinkedListNode<string> node = m_messages.Last;
node.Value = new StringBuilder( node.Value ).Append( lines[ 0 ] ).ToString();
for( int i=1, len = lines.Length; i < len; i++ )
{
WriteLine( lines[ i ] );
}
}
}
/// <summary>
///
/// </summary>
/// <param name="message"></param>
public override void WriteLine( string message )
{
lock( m_messages )
{
if( m_messages.Count > MaxMessages + 1 )
m_messages.RemoveFirst();
LinkedListNode<string> node = m_messages.Last;
node.Value = new StringBuilder( node.Value ).Append( message ).ToString();
// add next line into queue - it's a start point for every next item in queue
m_messages.AddLast( string.Empty );
if( OnWriteLine != null )
{
OnWriteLine( this, new EventArgs<string>( node.Value ) );
}
}
}
/// <summary>
///
/// </summary>
public override void Close()
{
base.Close();
m_messages.Clear();
}
#endregion
}
/// <summary>
/// Generic EventArgs. Useful in usage with generic EventHandler.
/// </summary>
/// <typeparam name="T"></typeparam>
public class EventArgs<T> : EventArgs
where T : class
{
#region Class members
/// <summary></summary>
private T m_data;
#endregion
#region Class properties
/// <summary></summary>
public T Data
{
get
{
return m_data;
}
set
{
m_data = value;
}
}
#endregion
#region Class constructor
/// <summary></summary>
public EventArgs()
: this( null )
{
}
/// <summary></summary>
/// <param name="data"></param>
public EventArgs( T data )
{
m_data = data;
}
#endregion
}
/// <summary></summary>
/// <typeparam name="T"></typeparam>
public class SimpleEventArgs<T> : EventArgs
where T : struct
{
#region Class members
/// <summary></summary>
private T m_data;
#endregion
#region Class properties
/// <summary></summary>
public T Data
{
get
{
return m_data;
}
set
{
m_data = value;
}
}
#endregion
#region Class constructor
/// <summary></summary>
/// <param name="data"></param>
public SimpleEventArgs( T data )
{
m_data = data;
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -