WPF: assegnazione a RichTextBox.Document estremamente lento (7 minuti!)
-
08-07-2019 - |
Domanda
Sto costruendo un FlowDocument
formattato da XML. L'XML è ben formato e consiste principalmente di 10.000 nodi ciascuno con un singolo nodo con un valore di stringa di 6 caratteri.
L'analisi dell'XML in un XElement
e la costruzione del FlowDocument
in memoria richiedono circa 5 secondi. L'assegnazione del FlowDocument
alla proprietà Document
di un RichTextBox
nella mia applicazione richiede circa 7 minuti e massimizza la CPU per quel tempo.
Ecco il codice pertinente:
// 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;
Mi chiedo cosa stia succedendo qui. Ho profilato il codice e ho visto decine di migliaia di chiamate a metodi non gestiti come fsFormatSubtrackBottomless
e SubtrackFormatParaBottomless
.
Qualcuno può far luce sul problema o trovare una soluzione?
Soluzione 2
Alla fine, non sono riuscito a trovare una soluzione a questo.
Sto usando una soluzione alternativa - semplicemente non " pretty print " messaggi oltre una certa dimensione.
Se qualcuno ha una soluzione migliore, sentiti libero di pubblicarlo.
Altri suggerimenti
Segue estratto del Pro WPF in C # 2010 di MacDonald, p. 966:
Il RichTextBox di WPF, come la maggior parte dei controlli Rich Text che lo hanno preceduto, può essere un po 'lento. Se devi conservare enormi quantità di dati, utilizzare una logica complessa per gestire la pressione dei tasti o aggiungere effetti come la formattazione automatica (ad esempio, l'evidenziazione della sintassi di Visual Studio o sottolineatura del controllo ortografico di Word), < forte> il RichTextBox di WPF probabilmente non ha garantito le prestazioni di cui hai bisogno .