Kolejność operacji - Taski

Kolejność operacji - Taski
HI
  • Rejestracja:około 13 lat
  • Ostatnio:dzień
  • Postów:1857
0

Witam.

Pytanie pewne banalne (przydał by się Newbie ;) ), ale z programowaniem asynchronicznym miałem bardzo mało styczność.

Chce zrobić programik który:

  1. ściągnie plik z udziału
  2. wypakuje go

Jednocześnie chciałbym aby okno się nie zawieszało.

Uruchomiłem pkt. 1 w Tasku dzięki czemu okno jest cały czas dostępne, ale nie mam pomysłu, w jaki sposób poprawnie uruchomić wypakowywanie po zakończeniu kopiowania.

Klasa kopiująca ma zdarzenie OnComplete, ale wydaje mi się, że uruchamianie wypakowywania w tym miejscu nie jest do końca poprawne... (bo wyjdzie chyba na to, że klasa kopiująca, również odpowiada za wypakowanie pliku).

Użycie Wait() powoduje "freezowanie" okna, więc też nie jest to dobre rozwiązanie...

Jak powinienem to zrobić?

Z góry dziękuję za pomoc.
Pozdrawiam

edytowany 1x, ostatnio: hipekk
mar-ek1
  • Rejestracja:prawie 14 lat
  • Ostatnio:3 dni
  • Postów:525
0

Poczytaj o async/await w C#. To powinno rozwiązać Twój problem czyli nie blokować okna i jednocześnie nie robić wszystkiego na eventach.
Czyli robisz funkcję do pobierania jako

Kopiuj
async Task Download()
{
}

I potem tam gdzie używasz robisz:

Kopiuj
await Download();

// rozpakuj

kzkzg
async powinno być w sygnaturze metody która woła await'a
HI
  • Rejestracja:około 13 lat
  • Ostatnio:dzień
  • Postów:1857
0

Poczytałem troszkę, przetestowałem i nie bardzo rozumiem jak tym rozwiązać problem :).

Po wywołaniu metody z await program "idzie" dalej - nadal muszę go jakoś zatrzymać.

neves
  • Rejestracja:prawie 22 lata
  • Ostatnio:około 7 godzin
  • Lokalizacja:Kraków
  • Postów:1114
1

Alternatywnie (dopóki nie zrozumiesz await) możesz użyć Task.ContinueWith
Creating task continuations


edytowany 1x, ostatnio: neves
HI
  • Rejestracja:około 13 lat
  • Ostatnio:dzień
  • Postów:1857
0

Dziękuję za podpowiedź z ContinueWith.

Będę wdzięczny za dodatkowe wskazówki jak skorzystać z await w tym scenariuszu.

kzkzg
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 6 godzin
  • Postów:926
0

W najprostszym wydaniu będzie to tak:

Kopiuj
private async void MyMethod()
{
     await Task.Run(() =>
     {
          Thread.Sleep(3000); //symulacja dlugo trwajacej czynnosci
     });
      MessageBox.Show("done");
}

Keep calm and blame frontend.
Tell your cat I said pspsps.
edytowany 1x, ostatnio: kzkzg
SO
O ile ta długo trwająca czynność jest ciężka obliczeniowo, bo jeśli jest to pobranie pliku (pierwszy punkt który wymienił) to Task.Run nie ma sensu.
HI
A jak to lepiej wykonać w takim przypadku?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.