Ci sono alcune opzioni che puoi portare qui. Innanzitutto, è possibile impostare il doppio buffering sul modulo, che finirà per disegnare tutti gli aggiornamenti su una bitmap sottostante, che quindi visualizzerà l'immagine appena disegnata (anziché i singoli controlli di disegno su un oggetto grafico). Ho visto un aumento della velocità del 50% con questo metodo. Gettare questo nel costruttore:
this.SetStyle(
ControlStyles.AllPaintingInWmPaint |
ControlStyles.UserPaint |
ControlStyles.DoubleBuffer,true);
L'altra cosa da tenere a mente è che la concatenazione di stringhe è lento per grandi quantità di dati. È meglio usare StringBuilder per creare i dati e poi mostrarli usando StringBuilder.ToString (anche se è ancora meglio scaglionare gli aggiornamenti, forse una volta ogni 100 iterazioni). Sulla mia macchina, basta cambiarlo per aggiungerlo allo StringBuilder, è passato da 2,5 minuti per passare attraverso iterazioni da 10k a circa 1,5 minuti. Meglio, ma ancora lento.
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();
Infine, appena testato su sfalsamento (gettato un singolo condizionale nel codice sopra, proprio prima che la chiamata Invoke), ed è finito in 2 secondi. Dato che stiamo usando StringBuilder per creare effettivamente la stringa, conserviamo tutti i dati, ma ora dobbiamo fare gli aggiornamenti solo 100 volte rispetto a 10k volte.
Quindi, quali sono le opzioni? Poiché si tratta di un'applicazione WinForm, è possibile utilizzare uno dei tanti oggetti Timer per eseguire effettivamente l'aggiornamento dell'interfaccia utente per quel particolare controllo, oppure è sufficiente tenere un contatore di quanti "letture" o "aggiornamenti" ai dati sottostanti (nel tuo caso, un flusso) e aggiorna solo l'interfaccia utente sul numero X di modifiche. Utilizzare l'opzione StringBuilder e gli aggiornamenti sfalsati è probabilmente la strada da percorrere.
Sei in grado di leggere così veloce? Io non sono. Basta aggiornare la casella di testo ogni x secondi invece di ogni spunta di orologio. –
Questo era solo un esempio di come riprodurre il problema (anche se un po 'estremo). In realtà sto leggendo da un flusso, quindi gli aggiornamenti potrebbero arrivare veloci o lenti. – qJake
Ancora la mia domanda e il mio suggerimento rimangono gli stessi. L'interfaccia utente è per ospitare l'utente. –