Загрузка фотографий (> 2000) через WebClient - C#

Узнай цену своей работы

Формулировка задачи:

Добрый вечер!
Листинг программы
  1. public async Task DownloadManyFiles(Dictionary<Uri, string> files)
  2. {
  3. WebClient wc = new WebClient();
  4. wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
  5. wc.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
  6. foreach (KeyValuePair<Uri, string> pair in files)
  7. {
  8. await wc.DownloadFileTaskAsync(pair.Key, pair.Value);
  9. }
  10. wc.Dispose();
  11. }
  12. private void ButtonSaveAll_Click(object sender, EventArgs e)
  13. {
  14. Dictionary<Uri, string> dict = new Dictionary<Uri, string>();
  15. for (int i = 0; i < listPhoto.Count; i++)
  16. {
  17. Uri uri = new Uri(listPhoto[i].Split('|')[1]);
  18. try
  19. {
  20. dict.Add(uri, Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "/folder/" + uri.Segments[4]);
  21. }
  22. catch(Exception ex)
  23. {
  24. MessageBox.Show(ex.Message);
  25. }
  26. }
  27. DownloadManyFiles(dict);
Таким методом, у меня начинается скачивание файлов (фото) поочередно по прямой ссылке к фото. Так вот, иногда загрузка останавливается и всё, никаких исключений (прога не виснет). Например, встанет на 517 из 1000 и всё, дальше загрузка не идет. Все фото берутся из соц.сети вконтакте. Что это за трабла может быть? Кто сталкивался, подскажите, пожалуйста. Может можно установить какое-то

N

-ое время для начала загрузки? Пробовал на все исключения вешать

continue

, всё тщетно.

Решение задачи: «Загрузка фотографий (> 2000) через WebClient»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.IO;
  10. using System.Net;
  11. using System.Threading;
  12. using System.Threading.Tasks;
  13.  
  14. namespace vcWinFormTest {
  15.     public partial class Form1 : Form {
  16.         public Form1() {
  17.             InitializeComponent();
  18.             btnDownload.Click += new EventHandler(btnDownload_Click);
  19.         }
  20.  
  21.         void btnDownload_Click(object sender, EventArgs e) {
  22.             Dictionary<Uri, string> addresses = new Dictionary<Uri, string>();
  23.             foreach (string line in File.ReadAllLines("links.txt")) {
  24.                 try {
  25.                     addresses.Add(new Uri(line), Path.GetFileName(line));
  26.                 }
  27.                 catch { }
  28.             }
  29.             Progress reporter = new Progress();
  30.             reporter.ReportEvent += new EventHandler(reporter_ReportEvent);
  31.             progressBar1.Maximum = addresses.Count;
  32.  
  33.             Task.Factory.StartNew(() => DownloadAllFiles(addresses, reporter));
  34.         }
  35.  
  36.         void reporter_ReportEvent(object sender, EventArgs e) {
  37.             progressBar1.Invoke((Action)(() => progressBar1.Value++));
  38.             label1.Invoke((Action)(() => {
  39.                 label1.Text = string.Format("Downloaded: {0} from {1}",
  40.                 progressBar1.Value, progressBar1.Maximum);
  41.             }));
  42.            
  43.         }
  44.  
  45.         public  void DownloadAllFiles(Dictionary<Uri, string> addresses, IProgress<string> reporter) {
  46.             Directory.CreateDirectory(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Images"));
  47.             foreach (var address in addresses) {
  48.                 string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Images", address.Value);
  49.                 WebRequest req = WebRequest.Create(address.Key);
  50.                 using (WebResponse resp = req.GetResponse()) {
  51.                     using (Stream ns = resp.GetResponseStream()) {
  52.                         using (FileStream fs = File.Create(filePath)) {
  53.                             ns.CopyTo(fs);
  54.                             reporter.Report(address.Value);
  55.                         }
  56.                     }
  57.                 }
  58.             }
  59.             progressBar1.Invoke((Action)(() => progressBar1.Value = 0));
  60.             label1.Invoke((Action)(() => label1.Text = "Completed!"));
  61.         }
  62.     }
  63.     class Progress : IProgress<string> {
  64.         public string Filename { get; private set; }
  65.         public event EventHandler ReportEvent = delegate { };
  66.  
  67.         public void Report(string value) {
  68.             Filename = value;
  69.             ReportEvent(this, EventArgs.Empty);
  70.         }
  71.     }
  72. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы