Приемник трассировки по умолчанию будет использовать win32 api OutputDebugString.Вы можете прослушивать сообщения, передаваемые этому методу, используя существующие инструменты.Посмотрите на это, например:
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));
});
}
}
}