From c20d722ee9417eb0efa9a70ccd9e3bfdcfe5d780 Mon Sep 17 00:00:00 2001 From: Renaud Paquay Date: Thu, 2 Jun 2011 17:23:14 -0700 Subject: [PATCH] Allow disabling parallel behavior through HostComponents.config Safety net... --HG-- branch : 1.x --- .../Caching/DefaultParallelCacheContext.cs | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/src/Orchard/Caching/DefaultParallelCacheContext.cs b/src/Orchard/Caching/DefaultParallelCacheContext.cs index 0d4678900..79284a509 100644 --- a/src/Orchard/Caching/DefaultParallelCacheContext.cs +++ b/src/Orchard/Caching/DefaultParallelCacheContext.cs @@ -10,22 +10,32 @@ namespace Orchard.Caching { _cacheContextAccessor = cacheContextAccessor; } + /// + /// Allow disabling parallel behavior through HostComponents.config + /// + public bool Disabled { get; set; } + public IEnumerable RunInParallel(IEnumerable source, Func selector) { - // Create tasks that capture the current thread context - var tasks = source.Select(item => this.CreateContextAwareTask(() => selector(item))).ToList(); - - // Run tasks in parallel and combine results immediately - var result = tasks - .AsParallel() // prepare for parallel execution - .AsOrdered() // preserve initial enumeration order - .Select(task => task.Execute()) // prepare tasks to run in parallel - .ToArray(); // force evaluation - - // Forward tokens collected by tasks to the current context - foreach (var task in tasks) { - task.Finish(); + if (Disabled) { + return source.Select(selector); + } + else { + // Create tasks that capture the current thread context + var tasks = source.Select(item => this.CreateContextAwareTask(() => selector(item))).ToList(); + + // Run tasks in parallel and combine results immediately + var result = tasks + .AsParallel() // prepare for parallel execution + .AsOrdered() // preserve initial enumeration order + .Select(task => task.Execute()) // prepare tasks to run in parallel + .ToArray(); // force evaluation + + // Forward tokens collected by tasks to the current context + foreach (var task in tasks) { + task.Finish(); + } + return result; } - return result; } ///