【发布时间】:2011-03-30 18:45:55
【问题描述】:
我有一个 BackgroundWorker 线程正在发布消息,在 GUI 的文本框中使用 BeginInvoke。在文本框中显示文本的方法write_debug_text 使用AppendText 并将文本写入Console。
外观是BackgroundWorker 写得太快,write_debug_text 跟不上。我在write_debug_text 设置了一个断点,并且必须等待很长时间才能被击中。许多对“BeginInvoke”的调用发生在断点被命中之前。
我正在寻找 UI 上消息的实时显示,就像 VS C# Express IDE 中的 System.Console。
通过搜索 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# 方面的第 5 个月。
【问题讨论】:
-
如果您调整了应用程序中的任何线程优先级,则将它们全部设置为 Normal 可能会解决此问题。
-
@Jeffrey:不幸的是,我不知道如何设置BackgroundWorker、GUI 和SerialPort 的优先级;所以我没有改变它们的默认设置。
标签: c# logging textbox real-time appendtext