private void DownloadLinks(CancellationToken token) { try { var posts = _links.GroupBy(x => x.Post.Id).ToDictionary(x => x.Key, x => x.ToList()); var ripper = new Core.RedditRip(txtFilter.Text, false, bAllowNsfw.Checked, bOnlyNsfw.Checked, bVerbose.Checked); var tasks = new List <Task>(); foreach (var post in posts) { token.ThrowIfCancellationRequested(); var downloadPostTask = ripper.DownloadPost(post, txtDestination.Text, token) .ContinueWith(antecedent => { var link = post.Value.FirstOrDefault(); OutputLine("Finished downloading post: " + (link != null ? link.Post.SubredditName + "/" : string.Empty) + post.Key); }, token); tasks.Add(downloadPostTask); } var downloadBatches = Batch(tasks, 10).ToList(); var batchCount = downloadBatches.Count; Task[] curretTasks = null; for (var i = 0; i < batchCount; i++) { var batch = downloadBatches.First(); curretTasks = batch.ToArray(); Task.WaitAll(curretTasks); downloadBatches.Remove(batch); } if (curretTasks.ToList().All(x => x.IsCompleted)) { OutputLine("Finished downloading."); EnableGetLinksButton(true); } } catch (OperationCanceledException) { OutputLine("Downloads canceled by user."); } catch (Exception e) { OutputLine("Unexpected Error Occured: " + e.Message); } finally { EnableCancelButton(false); } }
private async Task <List <ImageLink> > GetImgurLinksFromRedditSub(IEnumerable <String> subReddits, String filter, Boolean allowNsfw, Boolean onlyNsfw, SearchRange searchRange, Sorting sortOrder, CancellationToken token) { var tasks = new List <Task>(); var ripper = new Core.RedditRip(filter, false, allowNsfw, onlyNsfw, bVerbose.Checked); var reddit = new Reddit(); var imageLinks = new List <ImageLink>(); if (subReddits.Any()) { tasks.AddRange( subReddits.Where(x => !String.IsNullOrWhiteSpace(x)) .Select(sub => ripper.GetImgurLinksFromSubReddit(reddit, sub, searchRange, sortOrder, String.Empty, token))); //TODO:: Refactor destination out of saving links } await Task.WhenAll(tasks.ToArray()); imageLinks = tasks.Cast <Task <List <ImageLink> > >().Aggregate(imageLinks, (current, task) => CombineLinkLists(task.Result, current)); return(imageLinks); }