示例#1
0
        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();
            }
        }
示例#2
0
 public static OwForecast GetForecast(int owCityId)
 {
     cacheLock.EnterReadLock();
     try
     {
         OwForecast forecast = forecasts.TryGetValue(owCityId, out forecast) ? forecast : null;
         return(forecast);
     }
     finally
     {
         cacheLock.ExitReadLock();
     }
 }
示例#3
0
        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);
        }