diff --git a/src/Orchard/Caching/Cache.cs b/src/Orchard/Caching/Cache.cs index 267bc48fc..ac8c449e2 100644 --- a/src/Orchard/Caching/Cache.cs +++ b/src/Orchard/Caching/Cache.cs @@ -16,11 +16,11 @@ namespace Orchard.Caching { // "Add" lambda k => CreateEntry(k, acquire), // "Update" lamdba - (k, currentEntry) => (currentEntry.Tokens.All(t => t.IsCurrent) ? currentEntry : CreateEntry(k, acquire))); + (k, currentEntry) => (currentEntry.GetTokens() != null && currentEntry.GetTokens().Any(t => !t.IsCurrent) ? CreateEntry(k, acquire) : currentEntry)); // Bubble up volatile tokens to parent context - if (CacheAquireContext.ThreadInstance != null) { - foreach (var token in entry.Tokens) + if (CacheAquireContext.ThreadInstance != null && entry.GetTokens() != null) { + foreach (var token in entry.GetTokens()) CacheAquireContext.ThreadInstance.Monitor(token); } @@ -29,8 +29,8 @@ namespace Orchard.Caching { private static CacheEntry CreateEntry(TKey k, Func, TResult> acquire) { - var entry = new CacheEntry { Tokens = new List() }; - var context = new AcquireContext(k, volatileItem => entry.Tokens.Add(volatileItem)); + var entry = new CacheEntry(); + var context = new AcquireContext(k, entry.AddToken); IAcquireContext parentContext = null; try { @@ -49,7 +49,19 @@ namespace Orchard.Caching { private class CacheEntry { public TResult Result { get; set; } - public IList Tokens { get; set; } + private IList Tokens { get; set; } + + public void AddToken(IVolatileToken volatileToken) { + if (Tokens == null) { + Tokens = new List(); + } + + Tokens.Add(volatileToken); + } + + public IEnumerable GetTokens() { + return Tokens; + } } }