自定义跟踪输出

时间:2010-09-15 22:50:30

标签: c# debugging logging trace

我在我的两个项目中使用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:Performance :: OnCPUThread CPU   用法:[0%],内存使用量:59mb

我不在乎看到性能信息,所以我对控制台应用程序如何处理它非常满意,但我无法弄清楚如何为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();
        }
    }
}

我的TextBoxStreamWriter实现了TextWriter界面...唯一的另一个区别是控制台应用程序是.Net 4.0而GUI应用程序是.Net 3.5,但我怀疑这会有所作为。我的TextBoxStreamWriter实施可以找到here (pastie).

2 个答案:

答案 0 :(得分:1)

添加TraceListener不会导致记录该消息。

您能否提供有关您的应用正在做什么的更多详细信息。

尝试在新的简单WinForm应用程序中测试TraceListener,我不希望您看到这些消息。如果你这样做,你的监听器实现中会有一些东西......

答案 1 :(得分:0)

感谢Les,我强迫自己深入研究“问题”并意识到第三方DLL导致了性能日志。 C#或Trace类似乎没有什么固有的东西可以显示来自除程序员代码或引用库之外的任何其他地方的跟踪消息。