我有日志跟踪应用程序,它在不定式循环中执行后台工作线程并检查某个 TXT 文件中的最新条目。一旦找到新条目,我将使用 Dispatcher.Invoke 更新屏幕上的 TextBox,并将最新条目添加到文本文件中。
问题在于,如果源文本文件每毫秒不断更新,那么用户界面就会冻结,因为 Dispatcher.Invoke 如此频繁地更新 Textbox。
想知道是否有任何解决方法。我可以从文本文件中获得更大的块,但不想破坏日志跟踪实时体验,也不想延迟通过 UI 线程向 TextBox 写入行,因为这会使我的应用程序与内部的实际数据不同步源文本文件。
这是后台工作人员 DoWork 方法
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
reader = new StreamReader(new FileStream(file.File, FileMode.Open, FileAccess.Read, FileShare.ReadWrite));
lastMaxOffset = reader.BaseStream.Length;
while (true)
{
if (worker.CancellationPending)
{
e.Cancel = true;
break;
}
if (reader.BaseStream.Length == lastMaxOffset)
continue;
reader.BaseStream.Seek(lastMaxOffset, SeekOrigin.Begin);
string line = "";
while ((line = reader.ReadLine()) != null)
this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)(() =>
{
textLog.Text += "\r" + line;
scrollViewer.ScrollToBottom();
}));
lastMaxOffset = reader.BaseStream.Position;
}
}
如您所见,UI 线程只是简单地将文本附加到 TextBox,而当它碰巧经常界面冻结时