Настроить вывод трассировки - PullRequest
2 голосов
/ 16 сентября 2010

Я использую Trace в двух моих проектах, но я вижу различное поведение в обоих:

Первый проект - это консольное приложение, которое я преобразую в службу (после чегоЯ исключу следы консоли), и я добавлю двух Trace слушателей:

Trace.Listeners.Add(new TextWriterTraceListener(someFileStream));
Trace.Listeners.Add(new ConsoleTraceListener());

Второй проект - это приложение WinForm, и у меня есть "ConsoleForm", который отображает информацию о трассировке ипользователь может открывать и закрывать его по своему усмотрению.Для этого приложения я также добавляю прослушиватель Trace:

Trace.Listeners.Add(new TextWriterTraceListener(
    new TextBoxStreamWriter(new WriteToTextBox(OnTextBoxWrite))));

TextBoxStreamWriter - это пользовательский класс, созданный мной, который позволяет мне писать в текстовое поле ConsoleForm.В любом случае, вот проблема, с которой я столкнулся: консольное приложение не отображает какие-либо кривые производительности, в то время как Windows-приложение показывает, вот пример трассировки производительности:

API: Производительность :: OnCPUThread Загрузка ЦП: [0%], Использование памяти: 59 МБ

Мне не важно видеть информацию о производительности, поэтому я совершенно доволен работой консолиПриложение обрабатывает его, но я не могу понять, как получить такое же поведение для приложения Windows.Кто-нибудь знает, почему это происходит и как я могу это исправить?

Обновление

Я не делаю ничего сумасшедшего, на самом деле это даже просто ... вот мой код:

public partial class ConsoleForm : Form
{
    public delegate void WriteToTextBox(string value);

    public ConsoleForm()
    {
        InitializeComponent();
        Trace.AutoFlush = true;
        Trace.Listeners.Add(new TextWriterTraceListener(
            new TextBoxStreamWriter(new WriteToTextBox(OnTextBoxWrite))));
    }

    private void ConsoleForm_Load(object sender, EventArgs e)
    {
    }

    private void OnTextBoxWrite(string value)
    {
        if (!this.IsHandleCreated)
            return;

        if (this.InvokeRequired)
        {
            object[] parameters = { value };
            BeginInvoke(new WriteToTextBox(OnTextBoxWrite), parameters);
        }
        else
        {
            // ConsoleBox is a simple multiline text box
            ConsoleBox.AppendText(value);
        }
    }

    private void ConsoleForm_Closing(object sender, FormClosingEventArgs e)
    {
        Trace.Flush();
        if (e.CloseReason != CloseReason.FormOwnerClosing )
        {
            e.Cancel = true;
            this.Hide();
        }
    }
}

My TextBoxStreamWriter реализует интерфейс TextWriter ... единственное другое отличие состоит в том, что консольное приложение - .Net 4.0, а приложение с графическим интерфейсом - .Net 3.5, но я сомневаюсьэто будет иметь значение.Моя TextBoxStreamWriter реализация может быть найдена здесь (pastie).

Ответы [ 2 ]

1 голос
/ 28 сентября 2010

Простое добавление TraceListener не приведет к регистрации этого сообщения.

Не могли бы вы предоставить более подробную информацию о том, что делает ваше приложение.

Попробуйте протестировать свой TraceListener в новой простой WinFormприложение, я не ожидаю, что вы увидите эти сообщения.Если вы это сделаете, то есть что-то в вашей реализации слушателя ..

0 голосов
/ 29 сентября 2010

Благодаря Les, я заставил себя немного глубже вникнуть в «проблему» и понял, что сторонние DLL вызывают журналы производительности.Кажется, что в C # или в классе Trace нет ничего, что могло бы отображать сообщения трассировки откуда-либо еще, кроме кода программиста или библиотек, на которые есть ссылки.

...