У меня есть приложение для отслеживания журнала, которое выполняет фоновый рабочий поток в бесконечном цикле и проверяет последние записи в каком-то файле TXT. Как только он находит новые записи, я использую Dispatcher.Invoke для обновления TextBox на экране с последней записью, добавленной в текстовый файл.
Проблема в том, что если исходный текстовый файл постоянно обновляется каждую миллисекунду, пользовательский интерфейс просто зависает, так как Dispatcher.Invoke так часто обновляет Textbox.
Интересно, есть ли обходной путь. Я мог бы получить большие фрагменты из текстового файла, но не хочу портить работу журнала в реальном времени, а также не хочу откладывать запись строк в 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;
}
}
как вы можете видеть, поток пользовательского интерфейса просто добавляет текст в TextBox, и когда это случается, интерфейс часто зависает