Istnieje kilka opcji, które można wybrać tutaj. Po pierwsze, możesz ustawić podwójne buforowanie na formularzu, które zakończy rysowanie wszystkich aktualizacji na bazowej mapie bitowej, która wyświetli nowo narysowany obraz (zamiast pojedynczego rysowania elementów sterujących na obiekcie graficznym). Widziałem około 50% wzrost prędkości za pomocą tej metody. Rzuć to do konstruktora:
this.SetStyle(
ControlStyles.AllPaintingInWmPaint |
ControlStyles.UserPaint |
ControlStyles.DoubleBuffer,true);
Inną rzeczą, aby pamiętać, że ciąg konkatenacji jest powolny do dużych ilości danych. Lepiej jest użyć StringBuilder do zbudowania danych, a następnie po prostu pokazać je przy użyciu StringBuilder.ToString (choć nadal lepiej rozłożyć aktualizacje, może raz na 100 iteracji). Na moim komputerze, po prostu zmieniając go, aby dołączyć do StringBuilder, trwało od 2,5 minuty do uruchomienia iteracji 10k do około 1,5 minuty. Lepiej, ale wciąż wolno.
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();
Wreszcie tylko przetestowane zataczając (rzucił jeden warunkowy w powyższym kodzie, tuż przed wywołaniem Invoke), a zakończył w 2 sekundy. Ponieważ używamy StringBuilder do budowania łańcucha, wciąż przechowujemy wszystkie dane, ale teraz musimy tylko aktualizować 100 razy, a nie 10k razy.
Jakie są teraz opcje? Biorąc pod uwagę, że jest to aplikacja WinForm, można wykorzystać jeden z wielu obiektów Timera, aby faktycznie wykonać aktualizację interfejsu dla tej konkretnej kontrolki, lub po prostu zachować licznik liczby "odczytów" lub "aktualizacji" do danych podstawowych (w twoim przypadku strumień) i aktualizuj tylko UI dla X liczby zmian. Wykorzystanie zarówno opcji StringBuilder, jak i zmian naprzemiennych jest prawdopodobnie drogą do zrobienia.
Czy potrafisz czytać tak szybko? Nie jestem. Wystarczy zaktualizować pole tekstowe co x sekund zamiast każdego taktu zegara. –
To był tylko przykład, jak odtworzyć problem (choć trochę skrajny). W rzeczywistości czytam ze strumienia, więc aktualizacje mogą nadejść szybko lub wolno. – qJake
Nadal moje pytanie i sugestia pozostają takie same. Interfejs użytkownika jest przeznaczony dla użytkownika. –