Wpis z mikrobloga

Mam problem z implementacją i zrozumieniem mechanizmu asynchronicznego.

W osobnej klasie stworzyłem publiczną, statyczną metodę (nic nie zwraca), która w pętli wypisuje coś do Textboxa, linia po linii (aplikacja WPF).
Wszystko działa jak należy, ale po uruchomieniu tej funkcji za pomocą przycisku, program okazuje klasyczne objawy zajętego głównego wątku - zawieszenie okna, dopiero po chwili program odmraża się i wypisuje całość do Textobxa. Chcę to zrobić poprawnie, tj. tak, aby aplikacja nie była zawieszona, a Textbox był uzupełniany o treść na bieżąco.

Kierowałem się różnymi sposobami znalezionymi w sieci, ale żaden nie zadziałał.

#naukaprogramowania #csharp #wpf
  • 10
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@avangarda: Operacja aktualizacji kontrolki będzie odbywać się na wątku UI i jeśli spróbujesz zrobić to z innego wątku, czeka Cię radosny CrossThreadException czy jak on się tam nazywał. Skąd ta operacja bierze dane do wpisania do TextBoxa? Może tu masz problem, który chcesz pchnąć na inny wątek albo chociaż wywoływać asynchronicznie?
  • Odpowiedz
@avangarda: Tak na pierwszy rzut oka, to nie aktualizacja UI zmula Ci interfejs, tylko operacja na pliku, chyba, że robisz to na jakiś antycznym 386. .NET pozwala na operowanie na plikach na kilka różnych sposobów, dlaczego nie użyjesz jakiegoś asynchronicznego API? Klasa File chyba akurat takiego nie wystawia, ale wzorzec async/await wprowadzony w .NET 4.5 doszedł głównie po to, by nie zarzynać wątku UI cięższymi operacjami.
  • Odpowiedz
@avangarda: Panie, ta metoda za każdym razem otwiera plik, zapisuje tekst i zamyka go. I/O zawsze jest wąskim gardłem. Drugą opcją jest to, że dopisujesz coraz większą kobyłę do zawartości TextBoxa; w C# stringi są niemutowalne, więc tak naprawdę tworzysz za każdym razem nowego, coraz większego stringa. Dalej nie wiem, czemu nie robisz tego w sposób asynchroniczny, i czemu nie zrobisz raczej ListBoxa, do którego będziesz dokładał kolejne linijki jako
  • Odpowiedz
@Czesiowcy: Zapewne masz rację - można to zrobić lepiej i przebuduję to według Twoich sugestii, ale to nie rozwiąże głównego problemu. Nawet jeśli dla testu w funkcji robię prostego fora do 1000 i wypisuję (metoda nic poza tym nie robi), to Textbox jest odświeżony dopiero na koniec i widoczny z gotowym 1000 liczb.
  • Odpowiedz