예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
        }