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