デフォルトのトレースリスナーは、win32apiOutputDebugStringを使用します。既存のツールを使用して、このメソッドに渡されたメッセージを聞くことができます。たとえば、これを見てください。
http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx
多分それはあなた自身を書くのにかかる時間を節約するでしょう。
独自に作成する必要があり、トレースメッセージをトレースビューアアプリケーションにできるだけ速く取得することが主な関心事である場合は、TraceListenerにビューアからのネットワーク接続を受け入れさせることができます。トレースメッセージがトレースリスナーによって処理されるときはいつでも、ネットワークに書き込みます。もちろん、リモートマシンでトレースメッセージを表示できるかどうかを気にしない場合は、OutputDebugStringに入力された内容をリッスンすることもできます。
これはもちろんトレースを実行するアプリケーションのパフォーマンスに影響を与えるため、ネットワークへの書き込みは、トレース書き込み呼び出しをブロックせずに非同期で実行するのが最適です。ネットワークへの書き込み中に、処理するキューにトレースメッセージを追加する必要があります。
おそらく機能する簡単な例を次に示します。
public class NetworkPublishingTraceListener : TraceListener {
private List<string> messages = new List<string>();
private AutoResetEvent messagesAvailable = new AutoResetEvent(false);
private List<TcpClient> traceViewerApps;
private object messageQueueLock = new object();
public NetworkPublishingTraceListener(int port) {
// Setup code for accepting and dealing with network connections.
(new Thread(BackgroundThread) { IsBackground = true }).Start();
}
public override void Write(string message) {
if (traceViewerApps.Count == 0) {
return;
}
lock (messageQueueLock) {
messages.Add(message);
}
messagesAvailable.Set();
}
public override void WriteLine(string message) {
Write(message + Environment.NewLine);
}
private void BackgroundThread() {
while (true) {
messagesAvailable.WaitOne();
List<string> messagesToWrite;
lock (messageQueueLock) {
messagesToWrite = messages;
messages = new List<string>();
}
traceViewerApps.ForEach(viewerApp => {
StreamWriter writer = new StreamWriter(viewerApp.GetStream());
messagesToWrite.ForEach(message => writer.Write(message));
});
}
}
}