From fb025d9f685660c9b28f59632a65f1431c6d145b Mon Sep 17 00:00:00 2001 From: Qstick Date: Sun, 20 Aug 2023 16:46:55 -0500 Subject: [PATCH] Switch to Parallel.ForEach for list processing with MaxParallelism (cherry picked from commit 0f93e04186f24abdb0cf0b3ba6a3505fda834e06) --- .../FetchAndParseImportListService.cs | 79 +++++++------------ 1 file changed, 29 insertions(+), 50 deletions(-) diff --git a/src/NzbDrone.Core/ImportLists/FetchAndParseImportListService.cs b/src/NzbDrone.Core/ImportLists/FetchAndParseImportListService.cs index 382b76727..e1af65e79 100644 --- a/src/NzbDrone.Core/ImportLists/FetchAndParseImportListService.cs +++ b/src/NzbDrone.Core/ImportLists/FetchAndParseImportListService.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using NLog; -using NzbDrone.Common.TPL; using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.ImportLists @@ -41,10 +40,7 @@ namespace NzbDrone.Core.ImportLists _logger.Debug("Available import lists {0}", importLists.Count); - var taskList = new List(); - var taskFactory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.None); - - foreach (var importList in importLists) + Parallel.ForEach(importLists, new ParallelOptions { MaxDegreeOfParallelism = 5 }, importList => { var importListLocal = importList; var importListStatus = _importListStatusService.GetLastSyncListInfo(importListLocal.Definition.Id); @@ -56,35 +52,28 @@ namespace NzbDrone.Core.ImportLists if (DateTime.UtcNow < importListNextSync) { _logger.Trace("Skipping refresh of Import List {0} ({1}) due to minimum refresh interval. Next sync after {2}", importList.Name, importListLocal.Definition.Name, importListNextSync); - continue; + return; } } - var task = taskFactory.StartNew(() => - { - try - { - var importListReports = importListLocal.Fetch(); + try + { + var importListReports = importListLocal.Fetch(); - lock (result) - { - _logger.Debug("Found {0} reports from {1} ({2})", importListReports.Count, importList.Name, importListLocal.Definition.Name); + lock (result) + { + _logger.Debug("Found {0} reports from {1} ({2})", importListReports.Count, importList.Name, importListLocal.Definition.Name); - result.AddRange(importListReports); - } + result.AddRange(importListReports); + } - _importListStatusService.UpdateListSyncStatus(importList.Definition.Id); - } - catch (Exception e) - { - _logger.Error(e, "Error during Import List Sync of {0} ({1})", importList.Name, importListLocal.Definition.Name); - } - }).LogExceptions(); - - taskList.Add(task); - } - - Task.WaitAll(taskList.ToArray()); + _importListStatusService.UpdateListSyncStatus(importList.Definition.Id); + } + catch (Exception e) + { + _logger.Error(e, "Error during Import List Sync of {0} ({1})", importList.Name, importListLocal.Definition.Name); + } + }); result = result.DistinctBy(r => new { r.Artist, r.Album }).ToList(); @@ -105,35 +94,25 @@ namespace NzbDrone.Core.ImportLists return result; } - var taskList = new List(); - var taskFactory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.None); - var importListLocal = importList; - var task = taskFactory.StartNew(() => + try { - try + var importListReports = importListLocal.Fetch(); + + lock (result) { - var importListReports = importListLocal.Fetch(); + _logger.Debug("Found {0} reports from {1} ({2})", importListReports.Count, importList.Name, importListLocal.Definition.Name); - lock (result) - { - _logger.Debug("Found {0} reports from {1} ({2})", importListReports.Count, importList.Name, importListLocal.Definition.Name); - - result.AddRange(importListReports); - } - - _importListStatusService.UpdateListSyncStatus(importList.Definition.Id); + result.AddRange(importListReports); } - catch (Exception e) - { - _logger.Error(e, "Error during Import List Sync of {0} ({1})", importList.Name, importListLocal.Definition.Name); - } - }).LogExceptions(); - taskList.Add(task); - - Task.WaitAll(taskList.ToArray()); + _importListStatusService.UpdateListSyncStatus(importList.Definition.Id); + } + catch (Exception e) + { + _logger.Error(e, "Error during Import List Sync of {0} ({1})", importList.Name, importListLocal.Definition.Name); + } result = result.DistinctBy(r => new { r.Artist, r.Album }).ToList();