public async Task <CurrenciesServiceResponse> GetCurrenciesAsync(CancellationToken cancellationToken)
        {
            List <object> cacheKeyList = new List <object>();

            cacheKeyList.Add("GetCurrenciesAsync");

            string cacheKey = string.Join(":", cacheKeyList);

            CurrenciesServiceResponse data = (CurrenciesServiceResponse)cache.Get(cacheKey);

            if (data == null)
            {
                await Settings.CurrenciesServiceLock.WaitAsync();

                try
                {
                    data = (CurrenciesServiceResponse)cache.Get(cacheKey);
                    if (data == null)
                    {
                        string responseString = "";

                        if (_dataPath != "" && File.Exists(_dataPath + Settings.CurrenciesServiceFileName))
                        {
                            var path = _dataPath + Settings.CurrenciesServiceFileName;
                            responseString = File.ReadAllText(path);
                        }
                        else
                        {
                            var variables = new Dictionary <string, string>();
                            variables.Add("{apiKey}", ApiKey());

                            var URL      = Settings.CurrenciesServiceURL.ReplaceFromDictionary(variables);
                            var response = await WebRequestHelper.GetAsync(URL, WebRequestHelper.ResponseAcceptType.JSON, cancellationToken);

                            responseString = response.Item1.BytesToString();

                            try
                            {
                                if (_dataPath != "")
                                {
                                    File.WriteAllText(_dataPath + Settings.CurrenciesServiceFileName, responseString);
                                }
                            }
                            catch
                            {
                            }
                        }
                        data = JsonConvert.DeserializeObject <CurrenciesServiceResponse>(responseString);

                        cacheCurrencies(data, cancellationToken);
                    }
                }
                finally
                {
                    Settings.CurrenciesServiceLock.Release();
                }
            }

            return(data);
        }
        private void cacheCurrencies(CurrenciesServiceResponse data, CancellationToken cancellationToken)
        {
            List <object> cacheKeyList = new List <object>();

            cacheKeyList.Add("GetCurrenciesAsync");

            string cacheKey = string.Join(":", cacheKeyList);

            CacheItemPolicy policy = new CacheItemPolicy();

            policy.AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddMinutes(Settings.CurrenciesServiceCacheExpiration));
            cache.Add(cacheKey, data, policy);

            foreach (Currency currency in data.Currencies)
            {
                cache.Add("currency:" + currency.Code, currency, policy);
            }
        }