diff --git a/AsyncImageLoader.Avalonia/Loaders/BaseWebImageLoader.cs b/AsyncImageLoader.Avalonia/Loaders/BaseWebImageLoader.cs index 975f868..f6fac42 100644 --- a/AsyncImageLoader.Avalonia/Loaders/BaseWebImageLoader.cs +++ b/AsyncImageLoader.Avalonia/Loaders/BaseWebImageLoader.cs @@ -50,7 +50,7 @@ public void Dispose() { } /// - public async Task ProvideImageAsync(string url, IStorageProvider? storageProvider = null) { + public virtual async Task ProvideImageAsync(string url, IStorageProvider? storageProvider = null) { return await LoadAsync(url, storageProvider).ConfigureAwait(false); } diff --git a/AsyncImageLoader.Avalonia/Loaders/RamCachedWebImageLoader.cs b/AsyncImageLoader.Avalonia/Loaders/RamCachedWebImageLoader.cs index f5e3f45..284bf48 100644 --- a/AsyncImageLoader.Avalonia/Loaders/RamCachedWebImageLoader.cs +++ b/AsyncImageLoader.Avalonia/Loaders/RamCachedWebImageLoader.cs @@ -2,6 +2,7 @@ using System.Net.Http; using System.Threading.Tasks; using Avalonia.Media.Imaging; +using Avalonia.Platform.Storage; namespace AsyncImageLoader.Loaders; @@ -29,6 +30,14 @@ public RamCachedWebImageLoader(HttpClient httpClient, bool disposeHttpClient) : return bitmap; } + public override async Task ProvideImageAsync(string url, IStorageProvider? storageProvider = null) { + var bitmap = await _memoryCache.GetOrAdd(url, x => LoadAsync(x, storageProvider)).ConfigureAwait(false); + // If load failed - remove from cache and return + // Next load attempt will try to load image again + if (bitmap == null) _memoryCache.TryRemove(url, out _); + return bitmap; + } + public void ClearRamCache() { _memoryCache.Clear(); }