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);
            }
        }