Я использую 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).