Czasochłonne operacje w Windows Forms

0

Dzień dobry

Mam projekt który wykorzystuje następujące operacje, żadanie HTTPRequest, Dostęp do bazy danych, Wysyłanie plików na ftp, testowanie połączeń. Cały ten proces wykonuje się około 5 minut przez co blokuje mi interfejs użytkownika. Mam przycisk po którym kliknięciu wykonuje się to wszystko. Wie ktoś jak odblokować interfejs użytkownika, żeby można było swobodnie zminimalizować okno. Dodam, że próbowałem, ze standardowym Thread i coś nie bardzo chce to działać. Może są jakieś inne kolekcje.

0

Tylko wielowątkowość nie ma innej opcji, zamrożenie aplikacji to już przeszłość - i mam nadzieję że tak nikt już nie pisze :)
Sprawdź background worker https://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

1

Zrób to asynchronicznie(najlepiej wykorzystując async-await).
Kod będzie się minimalnie różnił od sekwencyjnego a UI nie będzie się zamrażało.

IMO twój przypadek to idealny przykład do użycia właśnie async-await, a nie wątków, bo wszystkie twoje operacje to I/O.

0

some_ONE asynchroniczności też można wykorzystać - kolega narzekał również na czas wykonania, więc aż się ciśnie żeby skorzystać z zalet wielowątkowości - backgroundworker jest wbudowany, o ile nie ma konieczności synchronizacji zadań.

0

IMO wciąż nie.

Stworzysz sobie te 4 wątki, które nie będą nic robiły tylko czekały aż zakończy się operacja I/O. Bez sensu.

Jak wywoła sobie te asynchroniczne zapytania do jakiegoś HTTP, bazy itp. a na końcu zrobi await Task.WhenAny()/WhenAll() to też uzyska przyspieszenie, bo będą się odbywać jednocześnie.
Coś takiego:

var task1 = CallDatabaseAsync();
var task2 = CallHttpAsync();

await Task.WhenAll(task1,task2);
0

To samo można zrobić na samych taskach, async/await to tylko skrócony zapis, dostępny dopiero od .net 4.5

0

To samo można zrobić na samych taskach

Można, ale czy powinno się jak można skorzystać z async-await?

0

chyba najprostrzym rozwiazaniem jest juz wspomniany background worker;
mozne on publikowac dane postepu, mozna go przerwac (wczesniej ustawic odpowiednia wlasciwosc);

Rozwiazanie z "klasycznym" watkiem tez jest ok. Moze byc potrzeba zabezpiecznia (lub opakowania) przekazywanych danych miedzy watkami w trakcie dzialania
(Jezeli watek gui ma cos publikowac na podstawie danych uzyskanych z watku pracujacego).

Generalnie "puszczanie" czegokolwiek czasochlonnego (nawet troche) w watku gui jest niefajne -> "aplikacja nie odpowiada..." :)

Innym rozwiazaniem jest uzywanie odpowiednikow asynchronicznych (dla ftp istenija, dla reqestow tez na 100%).

Na jedna rzecz zworce uwage: Sa trzy najbardziej popularne (w sdk) klasy operowania na danych z netu.
WebClient, HttpClient, HtmlRequest. Czasem warto przeanalizowac czy wykorzystujemy najlepsza.
W necie mozna znaleŹĆ duzo porownan (wydajnosciowe, uzywanie zasobow, wielowotkowosc), wad i zalet. Glownie po ang (ale to chyba normalne).

Pozdrawiam :)
Pawel

1 użytkowników online, w tym zalogowanych: 0, gości: 1