Zaczekanie na dokończenie akcji w wątku

Odpowiedz Nowy wątek
2016-02-08 22:39

Rejestracja: 4 lata temu

Ostatnio: 3 lata temu

0

Witam, mam problem z wielowątkowością ponieważ chciałbym aby po wywołaniu funkcji startDownload() a następnie jej zakończeniu program użył kolejnej funkcji do wypakowania pobranego pliku lecz przez to, że pobieranie jest w nowym wątku to od razu po rozpoczęciu pobierania program próbuje rozpakować plik którego nie ma. I tu jest problem, próbowałem różnych metod jak zrobić aby przeczekać pobieranie i żeby dopiero po jego ukończeniu program przechodził do następnego kroku (unzip) lecz zakończyło się to fiaskiem.

Miałby ktoś może jakieś sugestie odnośnie naprawy mojego problemu?

Tak wygląda moja funkcja do pobierania pliku i aktualizowania paska postępu.

private void startDownload(string fileName, string fileLocation)
{
    Thread thread = new Thread(() => {
          WebClient client = new WebClient();
          client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
          client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
          client.DownloadFileAsync(new Uri("http://joshua-ferrara.com/luahelper/+"fileName"+.zip"), fileLocation);
    });
    thread.Start();
}
void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    this.BeginInvoke((MethodInvoker) delegate {
        double bytesIn = double.Parse(e.BytesReceived.ToString());
        double totalBytes = double.Parse(e.TotalBytesToReceive.ToString());
        double percentage = bytesIn / totalBytes * 100;
        label2.Text = "Downloaded " + e.BytesReceived + " of " + e.TotalBytesToReceive;
        progressBar1.Value = int.Parse(Math.Truncate(percentage).ToString());
    });
}
void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
    this.BeginInvoke((MethodInvoker) delegate {
         label2.Text = "Completed";
    }); 
}
edytowany 2x, ostatnio: Yipo, 2016-02-08 22:41

Pozostało 580 znaków

2016-02-08 22:50

Rejestracja: 5 lat temu

Ostatnio: 9 minut temu

1

A po co używasz do tego Thread ?

Zrób to normalnie asynchronicznie to nie będzie problemu.(nie zauważyłem, że to jest już asynchronicznie).

http://stackoverflow.com/ques[...]await-with-progress-reporting <- to ma robić chyba to samo co chcesz

Nie wiem czy ten Thread ma jakiś sens w twoim przypadku bo przecież wykonujesz to asynchronicznie więc UI nie powinno być blokowane. Wywołanie wypakowania pliku bym wsadził do DownloadFileCompleted, które wywołuje się przecież po pobraniu pliku.

edytowany 2x, ostatnio: some_ONE, 2016-02-08 23:31
dokładnie - ten kod nie ma większego sensu jeśli chodzi o wątek - abrakadaber 2016-02-09 09:12
Ten kod z stackoverflow działa tylko szkoda, że z NET 4.5 a ja niestety przez użytkowników z windows xp muszę używać co najwyżej 4.0 :/ Jakieś inne sugestie? @abrakadaber Gdyby nie było tego wątku to program pierw pobrałby plik a dopiero później uzupełnił pasek postępu. - Yipo 2016-02-14 17:03

Pozostało 580 znaków

Odpowiedz

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