У меня есть несколько URL-адресов, хранящихся в текстовом файле, каждый из которых является ссылкой, ведущей к смайлику Facebook, например https://www.facebook.com/images/emoji.php/v5/u75/1/16/1f618.png
Я пытаюсь загрузить эти изображения и сохранить их на своем диске. Я использую WebClient с DownloadFileAsync, что-то вроде
using (var client = new WebClient())
{
client.DownloadFileAsync(imgURL, imgName);
}
Моя проблема заключается в том, что даже если количество URL-адресов невелико, скажем, 10, некоторые изображения загружаются нормально, некоторые выдают ошибку повреждения файла. Поэтому я подумал, что мне нужно дождаться загрузки файлов до конца, и добавил событие DownloadFileCompleted, подобное этому
using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Linq;
using System.Net;
class Program
{
static Queue<string> q;
static void Main(string[] args)
{
q = new Queue<string>(new[] {
"https://www.facebook.com/images/emoji.php/v5/u51/1/16/1f603.png",
"https://www.facebook.com/images/emoji.php/v5/ud2/1/16/1f604.png",
"https://www.facebook.com/images/emoji.php/v5/ud4/1/16/1f606.png",
"https://www.facebook.com/images/emoji.php/v5/u57/1/16/1f609.png",
"https://www.facebook.com/images/emoji.php/v5/u7f/1/16/1f60a.png",
"https://www.facebook.com/images/emoji.php/v5/ufb/1/16/263a.png",
"https://www.facebook.com/images/emoji.php/v5/u81/1/16/1f60c.png",
"https://www.facebook.com/images/emoji.php/v5/u2/1/16/1f60d.png",
"https://www.facebook.com/images/emoji.php/v5/u75/1/16/1f618.png",
"https://www.facebook.com/images/emoji.php/v5/u1e/1/16/1f61a.png"
});
DownloadItem();
Console.WriteLine("Hit return after 'finished' has appeared...");
Console.ReadLine();
}
private static void DownloadItem()
{
if (q.Any())
{
var uri = new Uri(q.Dequeue());
var file = uri.Segments.Last();
var webClient = new WebClient();
webClient.DownloadFileCompleted += DownloadFileCompleted;
webClient.DownloadFileAsync(uri, file);
}
else
{
Console.WriteLine("finished");
}
}
private static void DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
DownloadItem();
}
}
Это не помогло, и я решил посмотреть внимательнее на файлы, которые повреждены.
Оказалось, что поврежденные файлы на самом деле были не файлами изображений, а HTML-страницами, которые либо имели некоторый код JavaScript для перенаправления на изображение, либо были полными HTML-страницами, в которых говорилось, что мой браузер не поддерживается.
Итак, мой вопрос: как мне на самом деле дождаться, когда файл изображения будет полностью загружен и готов к загрузке?
EDIT Я также пытался удалить оператор using
, но это тоже не помогло.
using
). Я хотел бы улучшить ваше управление объектами здесь, чтобы вы неDispose
из вашихWebClient
, пока вы на самом деле не закончите. Пока вы все еще пытаетесь понять основы, я, вероятно, предлагаю пока игнорировать асинхронность. - person Damien_The_Unbeliever   schedule 16.12.2016