У меня есть тема BackgroundWorker
, которая публикует сообщения, используя BeginInvoke
в текстовом поле в графическом интерфейсе. Метод write_debug_text
, который отображает текст в текстовом поле, использует AppendText
, а также записывает текст в Console
.
Похоже, что BackgroundWorker
пишет слишком быстро, чтобы write_debug_text
успевал. Я установил точку останова на write_debug_text
и мне пришлось долго ждать, пока она не будет нажата. Многие вызовы «BeginInvoke» происходят до достижения точки останова.
Я ищу отображение сообщений в реальном времени в пользовательском интерфейсе, очень похожее на System.Console
в VSE C # Express IDE.
Из поиска в SO я понимаю, что AppendText
- это более быстрый метод для использования и что, возможно, придется перераспределять строки.
В некоторых ответах предлагается использовать StringBuilder
, а затем периодически записывать этот текст в текстовое поле. Но это требует добавления большего количества событий и таймеров; что я бы предпочел не делать (мое приложение simple становится все более и более сложным).
Как я могу либо записывать в реальном времени в текстовое поле (и отображать его)?
Моя текущая идея - создать виджет, унаследованный от Textbox, который использует текстовую очередь и таймер.
Редактировать 1: пример кода
Вот фрагмент моего кода:
private m_textbox;
//...
m_textbox.BeginInvoke(new write_debug_text_callback(this.write_debug_text),
new object[] { debug_text });
return;
private void write_debug_text(string text)
{
string time_stamp_text = "";
time_stamp_text = DateTime.Now.ToString() + " ";
time_stamp_text += text;
m_textbox.AppendText(time_stamp_text);
m_textbox.Update();
System.Console.Write(time_stamp_text);
return;
}
Я попытался изменить BeginInvoke
на Invoke
, и мое приложение зависло. Когда я делаю паузу / прерывание с помощью отладчика, указатель выполнения находится на вызове Invoke
.
Кстати, у меня многолетний опыт работы с Java, C ++ и C. Я на пятом месяце работы с C #.