WPF: Affectation à RichTextBox.Document extrêmement lente (7 minutes!)
-
08-07-2019 - |
Question
Je construis un FlowDocument
formaté à partir de XML. Le code XML est bien formé et consiste principalement en 10 000 nœuds, chacun avec un seul nœud avec une valeur de chaîne de 6 caractères.
L'analyse du code XML en un XElement
et la construction du FlowDocument
en mémoire prennent environ 5 secondes. L'affectation de FlowDocument
à la propriété Document
d'un RichTextBox
dans mon application prend alors environ 7 minutes et limite l'utilisation maximale du processeur pour cette fois.
Voici le code pertinent:
// 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;
Je me demande ce qui se passe ici. J'ai profilé le code et vu des milliers d'appels à des méthodes non gérées, telles que fsFormatSubtrackBottomless
et SubtrackFormatParaBottomless
.
Quelqu'un peut-il apporter des éclaircissements sur le problème ou proposer une solution de contournement?
La solution 2
Au final, je n'ai pas trouvé de solution à ce problème.
J'utilise une solution de contournement. Je ne fais tout simplement pas "jolie impression". messages dépassant une certaine taille.
Si quelqu'un a une meilleure solution, n'hésitez pas à la poster.
Autres conseils
Extrait suivant du livre de WPD en C # 2010 de MacDonald, p. 966:
Le WPF RichTextBox, comme la plupart des contrôles de texte enrichi qui l'ont précédé, peut être un peu lent. Si vous devez stocker d’énormes quantités de données, utiliser une logique complexe pour gérer les appuis au clavier ou ajouter des effets tels que le formatage automatique (par exemple, la coloration syntaxique de Visual Studio ou le soulignement du vérificateur d’orthographe de Word), le RichTextBox de WPF a probablement gagné ». t fournir les performances dont vous avez besoin .