Я работаю над приложением Xamarin.Forms с MVVM.В моей модели представления я хочу получить всех пациентов из API.Это код:
public async Task GetAllPatients()
{
try
{
isFetchingData = true;
var response = await httpClient.GetStringAsync(baseUrl + "/patient?query=ma");
var resultPatients =
JsonConvert.DeserializeObject<ObservableRangeCollection<PatientViewModel>>
(testJson,jsonSerializerSettings);
AllPatients.ReplaceRange(resultPatients);
Patients.ReplaceRange(resultPatients);
}
catch(Exception e)
{
Console.WriteLine("*****ERROR kon API niet ophalen");
Console.WriteLine(e.Message);
}
finally
{
CheckIfEmptyList();
isFetchingData = false;
}
}
Сначала я просто жестко запрограммировал API из строки json (testJson
) в моем коде, и все прошло гладко.Но с того момента, как я выложил htppClient из комментариев, происходит нечто странное (даже когда я не использую переменную, как вы можете видеть в коде (я получаю тот же результат, когда использую переменную, хотя)).
Блок finally не выполняется.
То есть, когда я иду и отлаживаю приложение, код проходит через finally и проверяет, является ли списокпусто и помещает isFetchingData в false.Но я не вижу, что происходит на экране.Если список пуст, должна появиться метка, но теперь эта метка не исчезает, если список не пуст.INotifyPropertyChanged работает хорошо, потому что без httpClient он работает без сбоев.
Я очень плохо знаком с асинхронным программированием, так что, может быть, я забыл реализовать что-то, что должно обеспечить правильное завершение GetStringAsync?Может быть, он продолжает извлекать данные, и поэтому я никогда не вижу выполненный блок finally (даже если он скрывается за экраном).Я прочитал несколько статей об асинхронном программировании, но не смог найти что-то, что могло бы мне помочь.
Я также должен сказать, что этот метод вызывается из конструктора, что усложняет запуск асинхронного программирования.,Я попытался назвать его без асинхронного ожидания, и я попытался назвать это так:
Task.Run(async ()=> { await GetAllPatients(); });
Я пробовал с и без ConfigureAwait(false)
, но это тоже не имеет значения.