Загрузка фотографий (> 2000) через WebClient - C#
Формулировка задачи:
Добрый вечер!
Таким методом, у меня начинается скачивание файлов (фото) поочередно по прямой ссылке к фото. Так вот, иногда загрузка останавливается и всё, никаких исключений (прога не виснет). Например, встанет на 517 из 1000 и всё, дальше загрузка не идет. Все фото берутся из соц.сети вконтакте.
Что это за трабла может быть? Кто сталкивался, подскажите, пожалуйста.
Может можно установить какое-то
Листинг программы
- public async Task DownloadManyFiles(Dictionary<Uri, string> files)
- {
- WebClient wc = new WebClient();
- wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
- wc.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
- foreach (KeyValuePair<Uri, string> pair in files)
- {
- await wc.DownloadFileTaskAsync(pair.Key, pair.Value);
- }
- wc.Dispose();
- }
- private void ButtonSaveAll_Click(object sender, EventArgs e)
- {
- Dictionary<Uri, string> dict = new Dictionary<Uri, string>();
- for (int i = 0; i < listPhoto.Count; i++)
- {
- Uri uri = new Uri(listPhoto[i].Split('|')[1]);
- try
- {
- dict.Add(uri, Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "/folder/" + uri.Segments[4]);
- }
- catch(Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
- }
- DownloadManyFiles(dict);
N
-ое время для начала загрузки? Пробовал на все исключения вешатьcontinue
, всё тщетно.Решение задачи: «Загрузка фотографий (> 2000) через WebClient»
textual
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- using System.IO;
- using System.Net;
- using System.Threading;
- using System.Threading.Tasks;
- namespace vcWinFormTest {
- public partial class Form1 : Form {
- public Form1() {
- InitializeComponent();
- btnDownload.Click += new EventHandler(btnDownload_Click);
- }
- void btnDownload_Click(object sender, EventArgs e) {
- Dictionary<Uri, string> addresses = new Dictionary<Uri, string>();
- foreach (string line in File.ReadAllLines("links.txt")) {
- try {
- addresses.Add(new Uri(line), Path.GetFileName(line));
- }
- catch { }
- }
- Progress reporter = new Progress();
- reporter.ReportEvent += new EventHandler(reporter_ReportEvent);
- progressBar1.Maximum = addresses.Count;
- Task.Factory.StartNew(() => DownloadAllFiles(addresses, reporter));
- }
- void reporter_ReportEvent(object sender, EventArgs e) {
- progressBar1.Invoke((Action)(() => progressBar1.Value++));
- label1.Invoke((Action)(() => {
- label1.Text = string.Format("Downloaded: {0} from {1}",
- progressBar1.Value, progressBar1.Maximum);
- }));
- }
- public void DownloadAllFiles(Dictionary<Uri, string> addresses, IProgress<string> reporter) {
- Directory.CreateDirectory(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Images"));
- foreach (var address in addresses) {
- string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Images", address.Value);
- WebRequest req = WebRequest.Create(address.Key);
- using (WebResponse resp = req.GetResponse()) {
- using (Stream ns = resp.GetResponseStream()) {
- using (FileStream fs = File.Create(filePath)) {
- ns.CopyTo(fs);
- reporter.Report(address.Value);
- }
- }
- }
- }
- progressBar1.Invoke((Action)(() => progressBar1.Value = 0));
- label1.Invoke((Action)(() => label1.Text = "Completed!"));
- }
- }
- class Progress : IProgress<string> {
- public string Filename { get; private set; }
- public event EventHandler ReportEvent = delegate { };
- public void Report(string value) {
- Filename = value;
- ReportEvent(this, EventArgs.Empty);
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д