Вопрос

До сих пор в моем приложении я регистрирую все события трассировки в файл на своем жестком диске.

Теперь я хочу улучшить его в форме отдельного приложения Trace Windows, которое слушает

к следу от основного приложения (как они генерируются) и сообщите об этом на

Gridview как интерфейс. Теперь вопрос:

Какой вид трасселиста я должен использовать, чтобы получить максимальную выгоду для скорости, с которой читается информация о журнале?

ОграниченияИз -за определенных ограничений я не могу использовать подход журнала и чтения базы данных

Поможет ли прослушивание приложения EventLogs каким -либо образом?

Спасибо за предложения и время.

Это было полезно?

Решение

Слушатель трассировки по умолчанию будет использовать Win32 API outputDebugString. Вы можете прослушать сообщения, передаваемые этому методу, используя существующие инструменты. Посмотрите на это, например:

http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx

Может быть, это сэкономит вам время, необходимое для написания собственного.

Если вы действительно хотите написать свою собственную, и ваша главная задача - получить как можно быстрее, чтобы получить сообщения трассировки в приложение Trace Viewer, то вы можете попросить, чтобы ваш трассоц примет сетевые подключения от зрителя. Всякий раз, когда следовые сообщения обрабатываются прослушивателем трассировки, вы пишете в сеть. Если вы не обеспокоены возможностью просматривать сообщения трассировки на удаленной машине, то, конечно же, прослушивание того, что поставлено в 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));
            });
        }
    }
}

Другие советы

Почему бы тебе не использовать log4net или же nlog ?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top