I'm trying to download a huge load of files(pictures) from the internet. I'm stuggling with async/parallel, because
a) I cant say whether there is a file, or not. I just got a million links provided with either a singe picture (300kb to 3MB) or 404 page does not exist. So to escape downloading an 0-Byte file, i ask the same page twice, once for 404 and after that for the picture. THe other way would be downloading all 0-byte files and deleting millions of them afterwards - which keeps windows 10 stuck on this task until i reboot.
b) While the (very slow) download is in progress, whenever I have a look at any of the "successfull downloaded files", it is created with 0 bytes and dont contain the picture. What do I need to change, to really download the file before going to download the next one?
How do i fix this both issues? Is there any better way to download tousands or millions of files (compression/creating .zip on the server is not possible)
//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
{
}
}