Здесь вы можете выбрать несколько вариантов.Во-первых, вы можете установить двойную буферизацию в форме, в результате чего все обновления будут отображаться в базовом растровом изображении, которое затем отображает вновь нарисованное изображение (вместо индивидуального рисования элементов управления на графическом объекте).Я видел примерно 50% увеличение скорости с этим методом.Добавьте это в конструктор:
this.SetStyle(
ControlStyles.AllPaintingInWmPaint |
ControlStyles.UserPaint |
ControlStyles.DoubleBuffer,true);
Еще одна вещь, которую нужно иметь в виду, это то, что конкатенация строк является МЕДЛЕННОЙ для больших объемов данных.Лучше использовать StringBuilder для построения данных, а затем просто показать их с помощью StringBuilder.ToString (хотя все же лучше разбивать обновления, возможно, один раз каждые 100 итераций).На моей машине, просто изменив его на добавление в StringBuilder, он прошел от 2,5 минут до 10 000 итераций примерно до 1,5 минут.Лучше, но все еще медленно.
new System.Threading.Thread(() =>
{
for(int i = 0; i < 10000; i++)
{
sb.AppendLine(DateTime.Now.ToString());
Invoke((Action)(() =>
{
txtArea.Text = sb.ToString();
txtArea.SelectionStart = txtArea.Text.Length;
txtArea.ScrollToCaret();
}));
}
}).Start();
Наконец, только что проверил ошеломление (бросил один условный код в приведенный выше код прямо перед вызовом Invoke), и оно завершилось через 2 секунды.Поскольку мы используем StringBuilder для фактического построения строки, мы по-прежнему сохраняем все данные, но теперь нам нужно выполнять обновления только 100 раз, а не 10 тысяч раз.
Итак, каковы ваши варианты?Учитывая, что это приложение WinForm, вы можете использовать один из множества объектов Timer для фактического выполнения обновления пользовательского интерфейса для этого конкретного элемента управления, или вы можете просто сохранить счетчик количества «чтений» или «обновлений» базовых данных (в твоем случае поток) и обновляй интерфейс только на Х количество изменений.Вероятно, следует использовать как параметр StringBuilder, так и поэтапное обновление.