【发布时间】:2015-12-10 22:12:30
【问题描述】:
我有一个后台线程,它正在从设备读取消息并将它们格式化并将它们传递给生产者/消费者集合的“消费者”节点,然后将所有消息打印到字符串中。我遇到的问题是日志记录在进程结束之后有点滞后,所以我试图找到一种更快的方法来打印到屏幕上。这是我的消费者方法:
private void DisplayMessages(BlockingCollection<string[]> messages)
{
try
{
foreach (var item in messages.GetConsumingEnumerable(_cancellationTokenSource.Token))
{
this.Invoke((MethodInvoker)delegate
{
outputTextBox.AppendText(String.Join(Environment.NewLine, item) + Environment.NewLine);
});
}
}
catch (OperationCanceledException)
{
//TODO:
}
}
我已经对我的生产者方法进行了一些基准测试,甚至登录到控制台,看起来写入这个 TextBox 的速度有点慢。在每个过程中,我记录了大约 61,000 行,大约 60 个字符长。
我研究过使用 .AppendText() 比使用 textBox.Text += newText 更好,因为这会重置整个 TextBox 的文本。我正在寻找一种解决方案,它可能包括更快的打印到 TB 的方法(或者更适合快速记录的 UI 元素?),或者如果使用 String.Join(Environment.NewLine, item) 效率低下并且可以以任何方式加速。
【问题讨论】:
-
或许使用字符串生成器而不是连接字符串?
-
所以你调用这个调用方法 61000 次?您正在用许多请求的方式淹没消息泵。您需要以基于时间的方式更新 UI。
-
尝试在不先调用的情况下执行此操作。
-
只是一些提示:如果尚未使用“WordWrap=false”,则可以提供帮助(来自:stackoverflow.com/a/11276778/265165)
-
@McAdam331 for 1,向您的应用程序添加一个按钮以启动该文件的记事本++ 进程。其余的,你甚至可能不需要 lock 或 list
; 可能在您的 RAM 上使用每个 GUI 更新 stackoverflow.com/questions/3817477/… 直接读取日志文件会更简单、更容易。同样作为另一个 UX 想法,一个 hex/ascii/"parsed" 单选按钮很不错。
标签: c# winforms performance task-parallel-library producer-consumer