Вместо того, чтобы перезаписывать текст следующим образом:
textBlock4.Text = cell.InnerText
вы можете добавить это, как это:
textBlock4.Text += cell.InnerText
Лучшим (и более быстрым, поскольку он не использует медленную систему DependencyProperty как чрезмерную, а также освобождает диспетчер) подход будет заключаться в агрегировании текста в StringBuilder
и назначении его впоследствии, например:
StringBuilder sb = new StringBuilder();
foreach (HtmlNode cell in cells3)
{
sb.AppendLine(cell.InnerText);
}
Dispatcher.BeginInvoke(() => textBlock4.Text = sb.ToString());
sb.Clear();
// reuse sb for the following loops as shown above
Вы также можете использовать LINQ, что сделает все немного короче:
StringBuilder sb = cells3.Aggregate(
new StringBuilder(),
(sb, cell) => sb.AppendLine(cell.InnerText));
Dispatcher.BeginInvoke(() => textBlock4.Text = sb.ToString());