Zaczekanie na dokończenie akcji w wątku

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";
    }); 
}
 
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/questions/32269667/download-extract-zip-file-using-async-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.

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