public static void SaveForecast(OwForecast forecast) { if (forecast == null || forecast.list == null || !forecast.list.Any()) { return; } cacheLock.EnterWriteLock(); try { forecast.list = forecast.list.OrderBy(x => x.dt).ToList(); var minDt = forecast.list.First().dt; OwForecast cachedForecast = forecasts.TryGetValue(forecast.city.id, out cachedForecast) ? cachedForecast : null; if (cachedForecast != null) { cachedForecast.list = cachedForecast.list.Where(x => x.dt < minDt).ToList(); // add two ordered collections - get ordered as a result cachedForecast.list.AddRange(forecast.list); forecast.list = cachedForecast.list; } var now = DateTime.UtcNow; forecast.list = forecast.list.Where(x => x.UnixDt > now).ToList(); forecasts[forecast.city.id] = forecast; } finally { cacheLock.ExitWriteLock(); } }
public static OwForecast GetForecast(int owCityId) { cacheLock.EnterReadLock(); try { OwForecast forecast = forecasts.TryGetValue(owCityId, out forecast) ? forecast : null; return(forecast); } finally { cacheLock.ExitReadLock(); } }
public OwForecast GetForecastPageData(int?owCityId = null) { //if (!owCityId.HasValue) //{ // owCityId = defaultOwCityId; //} OwForecast owForecast = null; var lastFetchUtc = CacheUtil.GetLastFetchUtc(); if (owCityId.HasValue) { if (!lastFetchUtc.HasValue || lastFetchUtc.Value < DateTime.UtcNow.AddMinutes(-minutesBetweenRequests)) { var apiUrl = string.Format(apiUrlTemplate, owCityId); var result = httpClient.GetAsync(apiUrl).Result; if (result.IsSuccessStatusCode) { var resultString = result.Content.ReadAsStringAsync().Result; owForecast = JsonConvert.DeserializeObject <OwForecast>(resultString); lastFetchUtc = owForecast.FetchUtc = DateTime.UtcNow; CacheUtil.SaveForecast(owForecast); } } else { owForecast = CacheUtil.GetForecast(owCityId.Value); } } if (owForecast == null) { owForecast = new OwForecast(); } owForecast.AvailableFetchUtc = lastFetchUtc.HasValue ? lastFetchUtc.Value.AddMinutes(minutesBetweenRequests) : DateTime.UtcNow; return(owForecast); }