diff options
| author | Claus Vium <clausvium@gmail.com> | 2019-02-07 20:57:42 +0100 |
|---|---|---|
| committer | Claus Vium <clausvium@gmail.com> | 2019-02-15 19:33:10 +0100 |
| commit | 86940e96d51d9259fe6a9795e477f4ef0644a27e (patch) | |
| tree | 1e901d6bcf656b287bee58459274e1d9e7d813cd | |
| parent | 75d90c8e4c2213b7428640d407583f4e1c579aa4 (diff) | |
More MemoryCache PoC
| -rw-r--r-- | MediaBrowser.Providers/TV/TheTVDB/TvDbClientManager.cs | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/MediaBrowser.Providers/TV/TheTVDB/TvDbClientManager.cs b/MediaBrowser.Providers/TV/TheTVDB/TvDbClientManager.cs index e7b2d151c..ca50d4c2b 100644 --- a/MediaBrowser.Providers/TV/TheTVDB/TvDbClientManager.cs +++ b/MediaBrowser.Providers/TV/TheTVDB/TvDbClientManager.cs @@ -13,6 +13,7 @@ namespace MediaBrowser.Providers.TV { private static volatile TvDbClientManager instance; // TODO add to DI once Bond's PR is merged + private readonly SemaphoreSlim _cacheWriteLock = new SemaphoreSlim(1, 1); private static MemoryCache _cache; private static readonly object syncRoot = new object(); private static TvDbClient tvDbClient; @@ -73,24 +74,32 @@ namespace MediaBrowser.Providers.TV public async Task<SeriesSearchResult[]> GetSeriesByName(string name, CancellationToken cancellationToken) { - if (_cache.TryGetValue(name, out SeriesSearchResult[] series)) - { - return series; - } - var result = await TvDbClient.Search.SearchSeriesByNameAsync(name, cancellationToken); - _cache.Set(name, result.Data, DateTimeOffset.UtcNow.AddHours(1)); - return result.Data; + return await TryGetValue(name, + async () => (await TvDbClient.Search.SearchSeriesByNameAsync(name, cancellationToken)).Data); } public async Task<Series> GetSeriesById(int tvdbId, CancellationToken cancellationToken) { - if (_cache.TryGetValue(tvdbId, out Series series)) + return await TryGetValue(tvdbId, + async () => (await TvDbClient.Series.GetAsync(tvdbId, cancellationToken)).Data); + } + + private async Task<T> TryGetValue<T>(object key, Func<Task<T>> resultFactory) + { + if (_cache.TryGetValue(key, out T cachedValue)) { - return series; + return cachedValue; + } + using (_cacheWriteLock) + { + if (_cache.TryGetValue(key, out cachedValue)) + { + return cachedValue; + } + var result = await resultFactory.Invoke(); + _cache.Set(key, result, DateTimeOffset.UtcNow.AddHours(1)); + return result; } - var result = await TvDbClient.Series.GetAsync(tvdbId, cancellationToken); - _cache.Set(tvdbId, result.Data, DateTimeOffset.UtcNow.AddHours(1)); - return result.Data; } } } |
