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]); }