poniedziałek, 21 listopada 2011

C# - asynchroniczne pobieranie pliku

Aby pobrać plik z internetu nie blokując przy tym głównego wątku można użyć metody DownloadFileAsync z klasy WebClient. Można również dodać obsługę eventów aby wyświetlać postęp i wykryć kiedy plik został pobrany w całości. Przykładowy kod poniżej.

private void button1_Click(object sender, EventArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
if (sfd.ShowDialog() == DialogResult.OK)
{
WebClient wc = new WebClient();
wc.DownloadFileCompleted += new AsyncCompletedEventHandler(wc_DownloadFileCompleted);
wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged);
wc.DownloadFileAsync(new Uri(textBox1.Text), sfd.FileName);
}
}


void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}


void wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
MessageBox.Show("Pobieranie ukończone");
}


Gotowy projekt do pobrania: DownloadAsync.zip


I na koniec jeszcze jedna uwaga. Chociaż metoda jest asynchroniczna to i tak może na chwilę zablokować główny wątek. Dzieje się tak ponieważ przed pobraniem pliku konieczna jest zamiana adresu na IP i dzieje się to wewnątrz funkcji, która niestety jest blokująca. Aby temu zapobiec wystarczy (o ile to możliwe) zamiast nazwy podać IP.

Brak komentarzy:

Publikowanie komentarza