Пытаюсь закачать огромное количество файлов (картинок) с инте rnet. Я борюсь с async / parallel, потому что
a) Я не могу сказать, есть файл или нет. Я только что получил миллион ссылок либо с одной картинкой (от 300 КБ до 3 МБ), либо со страницей 404 не существует. Поэтому, чтобы избежать загрузки 0-байтового файла, я дважды запрашиваю одну и ту же страницу, один раз для 404, а затем для изображения. Другой способ - загрузить все 0-байтовые файлы и впоследствии удалить миллионы из них - что удерживает windows 10 в этой задаче до тех пор, пока я не перезагружусь.
b) Пока (очень медленная) загрузка выполняется , всякий раз, когда я смотрю на любой из «успешно загруженных файлов», он создается с 0 байтами и не содержит изображения. Что мне нужно изменить, чтобы действительно загрузить файл перед загрузкой следующего?
Как исправить обе эти проблемы? Есть ли лучший способ загрузить тысячи или миллионы файлов (сжатие / создание .zip на сервере невозможно)
//loopResult = Parallel.ForEach(_downloadLinkList, new ParallelOptions { MaxDegreeOfParallelism = 10 }, DownloadFilesParallel);
private async void DownloadFilesParallel(string path)
{
string downloadToDirectory = "";
string x = ""; //in case x fails, i get 404 from webserver and therefore no download is needed
System.Threading.Interlocked.Increment(ref downloadCount);
OnNewListEntry(downloadCount.ToString() + " / " + linkCount.ToString() + " heruntergeladen"); //tell my gui to update
try
{
using(WebClient webClient = new WebClient())
{
downloadToDirectory = Path.Combine(savePathLocalComputer, Path.GetFileName(path)); //path on local computer
webClient.Credentials = CredentialCache.DefaultNetworkCredentials;
x = await webClient.DownloadStringTaskAsync(new Uri(path)); //if this throws an exception, ignore this link
Directory.CreateDirectory(Path.GetDirectoryName(downloadToDirectory)); //if request is successfull, create -if needed- the folder on local pc
await webClient.DownloadFileTaskAsync(new Uri(path), @downloadToDirectory); //should download the file, release 1 parallel task to get the next file. instead there is a 0-byte file and the next one will be downloaded
}
}
catch(WebException wex)
{
}
catch(Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
finally
{
}
}
// изображение sfw, ссылка nsfw введите описание изображения здесь