From 4cefc5323c7461615eb5387e13750b7ec51299f2 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sat, 8 Sep 2012 16:38:42 -0700 Subject: [PATCH] Using TPL for feed downloading - more speed! New: Faster searching and rss syncing --- NzbDrone.Core/Jobs/RssSyncJob.cs | 14 ++++++++------ NzbDrone.Core/Providers/SearchProvider.cs | 6 +++--- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/NzbDrone.Core/Jobs/RssSyncJob.cs b/NzbDrone.Core/Jobs/RssSyncJob.cs index e663dffee..66703cdac 100644 --- a/NzbDrone.Core/Jobs/RssSyncJob.cs +++ b/NzbDrone.Core/Jobs/RssSyncJob.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Ninject; using NLog; using NzbDrone.Core.Model; @@ -8,12 +9,12 @@ using NzbDrone.Core.Providers; using NzbDrone.Core.Providers.DecisionEngine; using NzbDrone.Core.Providers.Indexer; +using StackExchange.Profiling; namespace NzbDrone.Core.Jobs { public class RssSyncJob : IJob { - private readonly IEnumerable _indexers; private readonly DownloadProvider _downloadProvider; private readonly IndexerProvider _indexerProvider; private readonly MonitoredEpisodeSpecification _isMonitoredEpisodeSpecification; @@ -24,10 +25,9 @@ public class RssSyncJob : IJob private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); [Inject] - public RssSyncJob(IEnumerable indexers, DownloadProvider downloadProvider, IndexerProvider indexerProvider, + public RssSyncJob(DownloadProvider downloadProvider, IndexerProvider indexerProvider, MonitoredEpisodeSpecification isMonitoredEpisodeSpecification, AllowedDownloadSpecification allowedDownloadSpecification, UpgradeHistorySpecification upgradeHistorySpecification) { - _indexers = indexers; _downloadProvider = downloadProvider; _indexerProvider = indexerProvider; _isMonitoredEpisodeSpecification = isMonitoredEpisodeSpecification; @@ -49,20 +49,22 @@ public void Start(ProgressNotification notification, int targetId, int secondary { var reports = new List(); - foreach (var indexer in _indexers.Where(i => _indexerProvider.GetSettings(i.GetType()).Enable)) + notification.CurrentMessage = "Fetching RSS"; + + Parallel.ForEach(_indexerProvider.GetEnabledIndexers(), indexer => { try { - notification.CurrentMessage = "Fetching RSS from " + indexer.Name; reports.AddRange(indexer.FetchRss()); } catch (Exception e) { Logger.ErrorException("An error has occurred while fetching items from " + indexer.Name, e); } - } + }); Logger.Debug("Finished fetching reports from all indexers. Total {0}", reports.Count); + notification.CurrentMessage = "Processing downloaded RSS"; foreach (var episodeParseResult in reports) diff --git a/NzbDrone.Core/Providers/SearchProvider.cs b/NzbDrone.Core/Providers/SearchProvider.cs index 1c9302993..8aa86a491 100644 --- a/NzbDrone.Core/Providers/SearchProvider.cs +++ b/NzbDrone.Core/Providers/SearchProvider.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using NLog; using Ninject; using NzbDrone.Core.Model; @@ -208,7 +209,6 @@ public List PerformSearch(ProgressNotification notification, { //If single episode, do a single episode search, if full season then do a full season search, otherwise, do a partial search - var indexers = _indexerProvider.GetEnabledIndexers(); var reports = new List(); var title = _sceneMappingProvider.GetSceneName(series.SeriesId); @@ -218,7 +218,7 @@ public List PerformSearch(ProgressNotification notification, title = series.Title; } - foreach (var indexer in indexers) + Parallel.ForEach(_indexerProvider.GetEnabledIndexers(), indexer => { try { @@ -252,7 +252,7 @@ public List PerformSearch(ProgressNotification notification, { Logger.ErrorException("An error has occurred while fetching items from " + indexer.Name, e); } - } + }); return reports; }