バックグラウンドワーカースレッドを無限ループで実行し、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スレッドは、テキストボックスにテキストを追加するだけで、頻繁にインターフェイスがフリーズすることがあります。