2015-08-20 3 views
-1

Я создаю приложение WPF. Я использую WebClient для загрузки файлов. У меня есть список имен файлов, которые нужно загрузить с текущего пути. Я использую foreach для итерации по каждому имени, а затем для загрузки каждой последовательности файлов. Имя файла, которое я получаю от торрент-файла, который я расшифровываю.Использование webclient для загрузки файла в приложении WPF

public class DownloadGameFile 
{ 
    private DownloadTorrentFile DLTorrent; 

    //List of file that already exist 
    private List<string> ExistFile = new List<string>(); 
    DirectoryInfo fileInfo; 
    private volatile bool _completed; 

    private string savePath = @"C:\Program Files (x86)\program\Client\package\downloads\"; 

    public DownloadGameFile() 
    { 
     DLTorrent = new DownloadTorrentFile(); 
     fileInfo = new DirectoryInfo(savePath); 
    } 
    public bool StartDownload(int torrentId) 
    { 
     try 
     { 
      DLTorrent.DecodeTorrent(torrentId); 


      //File info from a Directory 
      FileInfo[] files = fileInfo.GetFiles(); 

      foreach (FileInfo i in files) 
      { 
       Console.WriteLine("Files exit "); 
       if (DLTorrent.GameInfomation[i.Name] != i.Length) 
       { 
        i.Delete(); 
       } 
       else 
       { 
        Console.WriteLine("add files "); 
        ExistFile.Add(i.Name); 
       } 
      } 
      //Make a list which file not downloaded yet 
      var res = DLTorrent.GameInfomation.Keys.Except(ExistFile); 

      foreach (var x in res) 
      { 
       Console.WriteLine(x); 
      } 

      foreach (var x in res) 
      { 
       DownloadProtocol("http://cdn.path.com/rental/" + torrentId + "/" + x, savePath + x); 
      } 

      return true; 

     } 
     catch 
     { 
      return false; 
     } 
    } 

    public void DownloadProtocol(string address, string location) 
    { 
     WebClient client = new WebClient(); 
     Uri Uri = new Uri(address); 

     client.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); 

     client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgress); 
     client.DownloadFileAsync(Uri, location); 


    } 


    private void DownloadProgress(object sender, DownloadProgressChangedEventArgs e) 
    { 
     // Displays the operation identifier, and the transfer progress. 
     Console.WriteLine("{0} downloaded {1} of {2} bytes. {3} % complete...", 
      (string)e.UserState, 
      e.BytesReceived, 
      e.TotalBytesToReceive, 
      e.ProgressPercentage); 
    } 

    private void Completed(object sender, AsyncCompletedEventArgs e) 
    { 
     if (e.Cancelled == true) 
     { 
      Console.WriteLine("Download has been canceled."); 
     } 
     else 
     { 

      Console.WriteLine("Download completed!"); 
     } 
    } 

Этот код отлично работает в приложении консоли с текущим блокировщиком потоков. Но когда я использую тот же код в приложении WPF, это не так. Я использую кнопку для запуска функции StartDownload(), но когда я это делаю, она начинает загружать все файлы одновременно. Пример: первый файл получает 3%, а затем переключается на другой файл и так далее. Я действительно не знаю, почему это не работает.

ответ

0

Вы считаете, что не используете .DownloadFileAsync? Вы можете попробовать. Загрузите файл и запустите DownloadProtocol() с одним фоновым потоком. Хотя я думаю, вам придется переосмыслить свой вывод DownloadProgress.

Я делаю что-то очень похожее в winform.

+0

Благодарим вас за отзыв @Residualfail, но он дает мне тот же результат. В одно и то же время загружаются все файлы? –