WPF: Назначение RichTextBox.Document очень медленно (7 минут!) - PullRequest
4 голосов
/ 28 октября 2009

Я создаю отформатированный FlowDocument из XML. XML хорошо сформирован и состоит в основном из 10 000 узлов, каждый из которых содержит один узел со значением строки из 6 символов.

Синтаксический анализ XML до XElement и построение FlowDocument в памяти занимает около 5 секунд. Присвоение FlowDocument свойству Document для RichTextBox в моем приложении занимает около 7 минут и приводит к максимальной загрузке ЦП на это время.

Вот соответствующий фрагмент кода:

// The following six lines of code execute in about 5 seconds

var xml = XElement.Parse(response.Data);

PrettyXmlConverter px = new PrettyXmlConverter();
FlowDocument fd = px.Render(xml);

Paragraph p = new Paragraph();
p.Inlines.Add(new Run(response.TimeStamp.ToShortDateString() + " " + response.TimeStamp.ToLongTimeString()));
fd.Blocks.InsertBefore(fd.Blocks.ElementAt(0), p);

// This line of code takes about 7 minutes and maxes out the CPU for that time.
tbResponse.Document = fd;

Мне интересно, что здесь происходит. Я профилировал код и вижу десятки тысяч обращений к неуправляемым методам, таким как fsFormatSubtrackBottomless и SubtrackFormatParaBottomless.

Может кто-нибудь пролить свет на проблему или придумать обходной путь?

Ответы [ 2 ]

2 голосов
/ 25 марта 2012

После выдержки из книги Макдональда Pro WPF в C # 2010 , стр. 966

WPF RichTextBox, как и большинство предшествующих ему элементов управления форматированным текстом, может быть немного вялым. Если вам нужно хранить огромные объемы данных, использовать сложную логику для обработки нажатий клавиш или добавлять эффекты, такие как автоматическое форматирование (например, подсветка синтаксиса Visual Studio или подчеркивание проверки орфографии в Word), WPF RichTextBox, вероятно, выиграл ' t обеспечивает необходимую производительность .

0 голосов
/ 05 ноября 2009

В конце концов, я не смог найти решение этой проблемы.

Я использую обходной путь - я просто не "печатаю" сообщения определенного размера.

Если у кого-то есть лучшее решение, не стесняйтесь опубликовать его.

...