создание загрузчика нескольких файлов http в WPF - PullRequest
0 голосов
/ 09 марта 2012

Я создаю загрузчик файлов в wpf, который загружает из списка файлов, переданных ему, и показывает индикатор выполнения для каждой отдельной загрузки .... список может содержать до 1000 файлов.

У меня есть весь код и особенности, но я застрял в одном ... как поставить файлы в очередь. Рассмотрим код ниже:

 private bool Download(String url, int i)
        {
            String FileName = "some location.mp4";
            label2.Content = "Downloading : " + ht[current.ToString()].ToString();
            progressBar1.Value = 0;            
            try
            {
                if (url.Equals(Constants.NotFound))
                    return false;

                if (File.Exists(FileName))
                {                      
                    current++;
                    if (current <= total)                                                
                        Download(ht[current.ToString()].ToString(), current);
                    else
                    {
                        this.WindowState = System.Windows.WindowState.Normal;
                        MessageBox.Show("Download Finished");
                    }

                    return true;
                }  
                wc.DownloadFileAsync(new Uri(url), FileName);                   
                return true;
            }
            catch
            { return false; }
        }

Чтобы захватить полное событие, я написал обработчик завершения события так:

void wc_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
    {
        current++;            
        if (current <= total)
            Download(ht[current.ToString()].ToString(), current);
        else
        {
            progressBar1.Value = 100;                
            label2.Content = "Download Finished.";
            label1.Content = "100 %";

            this.WindowState = System.Windows.WindowState.Normal;
            MessageBox.Show("Download Finished");
        }
    }

это прекрасно работает, когда ни один из загружаемых файлов уже не существует, но когда файлы уже существуют, тогда функция загрузки становится рекурсивным циклом и не возвращает значение до тех пор, пока не будут возвращены последующие вызовы функций и с учетом тысяч видео, может быть слишком много в памяти.

Таким образом, любой способ избежать этого / преодолеть это или, возможно, другой подход, чем я использую ??

и да, спасибо заранее ....:)

1 Ответ

0 голосов
/ 09 марта 2012

У вас есть рекурсия и дубликат кода. Попробуйте это:

            if (File.Exists(FileName))
            {                      
                return true;
            }
            else 
            {
                wc.DownloadFileAsync(new Uri(url), FileName);                   
                return true;
            }
...