Kolejność operacji - Taski

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

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

async Task Download()
{
}

I potem tam gdzie używasz robisz:

await Download();

// rozpakuj
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ć.

1

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

0

Dziękuję za podpowiedź z ContinueWith.

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

0

W najprostszym wydaniu będzie to tak:

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

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.