public TValue GetValueOrSetAsync(TKey key, Func <TValue> func, Action <Task> continueWith, TValue defaultValue, object lockToken, TimeSpan?funcTimespanLimit = null) { TimeLimitedCacheValue timeLimitedValue; if (this._cache.TryGetValue(key, out timeLimitedValue)) { timeLimitedValue.LastAccess = DateTime.Now; return(timeLimitedValue.Value); } lock (lockToken) { if (this._cache.TryGetValue(key, out timeLimitedValue)) { timeLimitedValue.LastAccess = DateTime.Now; return(timeLimitedValue.Value); } try { this._cache.AddOrUpdate(key, k => timeLimitedValue = new TimeLimitedCacheValue(defaultValue), (k, v) => timeLimitedValue = v); if (funcTimespanLimit == null) { var waitedTask = Task.Factory.StartNew(() => { timeLimitedValue.Value = func(); timeLimitedValue.LastAccess = DateTime.Now; this.CreateTimer(); }).ContinueWith(continueWith); } else { var waitedTask = Task.Factory.StartNew(() => { timeLimitedValue.Value = func(); timeLimitedValue.LastAccess = DateTime.Now; this.CreateTimer(); }); var waitingTask = Task.Factory.StartNew(() => { waitedTask.Wait((TimeSpan)funcTimespanLimit); }).ContinueWith(continueWith); } return(defaultValue); } catch (Exception) { throw; } } }
public TValue GetValueOrSet(TKey key, Func <TValue> func, object lockToken) { TimeLimitedCacheValue timeLimitedValue; if (this._cache.TryGetValue(key, out timeLimitedValue)) { timeLimitedValue.LastAccess = DateTime.Now; return(timeLimitedValue.Value); } lock (lockToken) { if (this._cache.TryGetValue(key, out timeLimitedValue)) { timeLimitedValue.LastAccess = DateTime.Now; return(timeLimitedValue.Value); } var value = func(); var chacheValue = new TimeLimitedCacheValue(value); this._cache.TryAdd(key, chacheValue); return(value); } }