public static async Task <T> GetOrCreateAsync <T>(this ICacheAsync cache, string key, Func <Task <T> > func, TimeSpan expiresIn, CacheDurationType cacheDuration, bool forceUpdate = false) where T : class
        {
            var rtnObj = await cache.Get <T>(key);

            if (rtnObj != null && forceUpdate == false)
            {
                return(rtnObj);
            }

            var lockOn = LockCache.GetOrAdd(key, () => new AsyncLock());

            using (await lockOn.LockAsync(TimeOut.AsyncLockTimeOut))
            {
                rtnObj = await cache.Get <T>(key);

                if (rtnObj != null && forceUpdate == false)
                {
                    return(rtnObj);
                }
                rtnObj = await func();

                await cache.Set(key, rtnObj, expiresIn, cacheDuration);

                return(rtnObj);
            }
        }
 public MachineIdConfig(ICacheAsync cacheAsync, SnowflakeOptions options)
 {
     this._cacheAsync = cacheAsync;
     Name             = options.Name;
     _datacenterId    = options.DataCenterId;
 }