diff --git a/src/Orchard/Environment/Extensions/ExtensionLoaderCoordinator.cs b/src/Orchard/Environment/Extensions/ExtensionLoaderCoordinator.cs index 41734cb5c..ad1c42f8b 100644 --- a/src/Orchard/Environment/Extensions/ExtensionLoaderCoordinator.cs +++ b/src/Orchard/Environment/Extensions/ExtensionLoaderCoordinator.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; @@ -192,15 +193,19 @@ namespace Orchard.Environment.Extensions { var previousDependencies = _dependenciesFolder.LoadDescriptors().ToList(); - var virtualPathModficationDates = new Dictionary(StringComparer.OrdinalIgnoreCase); + var virtualPathModficationDates = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); Logger.Information("Probing extensions"); - var availableExtensionsProbes = _parallelCacheContext + var availableExtensionsProbes1 = _parallelCacheContext .RunInParallel(availableExtensions, extension => _loaders.Select(loader => loader.Probe(extension)).Where(entry => entry != null).ToArray()) .SelectMany(entries => entries) - .GroupBy(entry => entry.Descriptor.Id) - .ToDictionary(g => g.Key, g => SortExtensionProbeEntries(g, virtualPathModficationDates), StringComparer.OrdinalIgnoreCase); + .GroupBy(entry => entry.Descriptor.Id); + + var availableExtensionsProbes = _parallelCacheContext + .RunInParallel(availableExtensionsProbes1, g => + new { Id = g.Key, Entries = SortExtensionProbeEntries(g, virtualPathModficationDates)}) + .ToDictionary(g => g.Id, g => g.Entries, StringComparer.OrdinalIgnoreCase); Logger.Information("Done probing extensions"); var deletedDependencies = previousDependencies @@ -241,14 +246,14 @@ namespace Orchard.Environment.Extensions { }; } - private IEnumerable SortExtensionProbeEntries(IEnumerable entries, Dictionary virtualPathModficationDates) { + private IEnumerable SortExtensionProbeEntries(IEnumerable entries, ConcurrentDictionary virtualPathModficationDates) { return entries .OrderByDescending(probe => GetVirtualPathDepedenciesModificationTimeUtc(virtualPathModficationDates, probe)) .ThenBy(probe => probe.Loader.Order) .ToList(); } - private DateTime GetVirtualPathDepedenciesModificationTimeUtc(IDictionary virtualPathDependencies, ExtensionProbeEntry probe) { + private DateTime GetVirtualPathDepedenciesModificationTimeUtc(ConcurrentDictionary virtualPathDependencies, ExtensionProbeEntry probe) { if (!probe.VirtualPathDependencies.Any()) return DateTime.MinValue; @@ -260,13 +265,8 @@ namespace Orchard.Environment.Extensions { return result; } - private DateTime GetVirtualPathModificationTimeUtc(IDictionary virtualPathDependencies, string path) { - DateTime dateTime; - if (!virtualPathDependencies.TryGetValue(path, out dateTime)) { - dateTime = _virtualPathProvider.GetFileLastWriteTimeUtc(path); - virtualPathDependencies.Add(path, dateTime); - } - return dateTime; + private DateTime GetVirtualPathModificationTimeUtc(ConcurrentDictionary virtualPathDependencies, string path) { + return virtualPathDependencies.GetOrAdd(path, p => _virtualPathProvider.GetFileLastWriteTimeUtc(p)); } IEnumerable ProcessExtensionReferences(ExtensionLoadingContext context, ExtensionProbeEntry activatedExtension) { diff --git a/src/Orchard/Environment/Extensions/ExtensionLoadingContext.cs b/src/Orchard/Environment/Extensions/ExtensionLoadingContext.cs index e73a5314e..0bce25cd7 100644 --- a/src/Orchard/Environment/Extensions/ExtensionLoadingContext.cs +++ b/src/Orchard/Environment/Extensions/ExtensionLoadingContext.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using Orchard.Environment.Extensions.Loaders; @@ -28,7 +29,7 @@ namespace Orchard.Environment.Extensions { /// /// Keep track of modification date of files (VirtualPath => DateTime) /// - public IDictionary VirtualPathModficationDates { get; set; } + public ConcurrentDictionary VirtualPathModficationDates { get; set; } /// /// List of extensions (modules) present in the system