diff --git a/src/Umbraco.Core/Cache/AppCacheExtensions.cs b/src/Umbraco.Core/Cache/AppCacheExtensions.cs index 0f1f242ed0..d70e293d4a 100644 --- a/src/Umbraco.Core/Cache/AppCacheExtensions.cs +++ b/src/Umbraco.Core/Cache/AppCacheExtensions.cs @@ -61,4 +61,35 @@ public static class AppCacheExtensions return result.TryConvertTo().Result; } + + public static async Task GetCacheItemAsync( + this IAppPolicyCache provider, + string cacheKey, + Func> getCacheItemAsync, + TimeSpan? timeout, + bool isSliding = false, + string[]? dependentFiles = null) + { + var result = provider.Get(cacheKey); + + if (result == null) + { + result = await getCacheItemAsync(); + provider.Insert(cacheKey, () => result, timeout, isSliding, dependentFiles); + } + + return result == null ? default : result.TryConvertTo().Result; + } + + public static async Task InsertCacheItemAsync( + this IAppPolicyCache provider, + string cacheKey, + Func> getCacheItemAsync, + TimeSpan? timeout = null, + bool isSliding = false, + string[]? dependentFiles = null) + { + T value = await getCacheItemAsync(); + provider.Insert(cacheKey, () => value, timeout, isSliding, dependentFiles); + } } diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Cache/RuntimeAppCacheTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Cache/RuntimeAppCacheTests.cs index 1b7efdd923..4da509f59b 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Cache/RuntimeAppCacheTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Cache/RuntimeAppCacheTests.cs @@ -27,4 +27,25 @@ public abstract class RuntimeAppCacheTests : AppCacheTests Assert.AreEqual(default(DateTime), AppCache.GetCacheItem("DateTimeTest")); Assert.AreEqual(null, AppCache.GetCacheItem("DateTimeTest")); } + + [Test] + public async Task Can_Get_With_Async_Factory() + { + var value = await AppPolicyCache.GetCacheItemAsync("AsyncFactoryGetTest", async () => await GetValueAsync(5), TimeSpan.FromMilliseconds(100)); + Assert.AreEqual(50, value); + } + + [Test] + public async Task Can_Insert_With_Async_Factory() + { + await AppPolicyCache.InsertCacheItemAsync("AsyncFactoryInsertTest", async () => await GetValueAsync(10), TimeSpan.FromMilliseconds(100)); + var value = AppPolicyCache.GetCacheItem("AsyncFactoryInsertTest"); + Assert.AreEqual(100, value); + } + + private static async Task GetValueAsync(int value) + { + await Task.Delay(10); + return value * 10; + } }