Beispiel #1
0
 private async Task <City> GetCity(string cityId, bool forceServerRefresh = false, MetaDataCityRow cityMetaData = null)
 {
     if (_cityLoading.ContainsKey(cityId) && _cityLoading[cityId] != null && !_cityLoading[cityId].IsFaulted && !_cityLoading[cityId].IsCompleted && !_cityLoading[cityId].IsCanceled)
     {
         if (!forceServerRefresh || _initialized)
         {
             return(await _cityLoading[cityId]);
         }
     }
     _cityLoading[cityId] = Task.Run(async() =>
     {
         Debug.WriteLine("[MainVm] GetCity for {0} (forcerefresh={1})", cityId, forceServerRefresh);
         if (!forceServerRefresh)
         {
             var offlineCity = await GetOfflineCityData(cityId);
             if (offlineCity != null)
             {
                 Debug.WriteLine("[MainVm] GetCity for {0} (forcerefresh={1}): found offline data", cityId,
                                 forceServerRefresh);
                 return(offlineCity);
             }
         }
         if (!InternetAvailable)
         {
             Debug.WriteLine(
                 "[MainVm] GetCity for {0} (forcerefresh={1}): internet not available, returning null", cityId,
                 forceServerRefresh);
             return(null);
         }
         Debug.WriteLine("[MainVm] GetCity for {0} (forcerefresh={1}): perform request", cityId,
                         forceServerRefresh);
         City city;
         try
         {
             city = await _client.GetCityAsync(cityId);
         }
         catch (ApiException e)
         {
             _exceptionService.HandleApiExceptionForCityData(e, MetaData.Cities.Get(cityId));
             return(null);
         }
         Debug.WriteLine("[MainVm] GetCity for {0} (forcerefresh={1}): got response", cityId, forceServerRefresh);
         _cityHasOnlineData[cityId] = true;
         await Task.Run(() =>
         {
             Task.Factory.StartNew(async() =>
             {
                 await Task.Delay(4000);
                 _storage.SaveCityData(cityId, city);
             });
             Task.Factory.StartNew(async() =>
             {
                 await Task.Delay(2000);
                 _voiceCommands.UpdateParkingLotList(cityMetaData ?? SelectedCity, city);
             });
         });
         return(city);
     });
     return(await _cityLoading[cityId]);
 }