Наконец, блок не выполняется при использовании HttpClient - PullRequest
0 голосов
/ 18 мая 2018

Я работаю над приложением 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), но это тоже не имеет значения.

1 Ответ

0 голосов
/ 18 мая 2018

Найти способ не помещать метод в конструктор (как предлагалось CrowCoder и Albert) казалось единственной возможностью.В этом случае мне удалось сделать это, но для других людей это не всегда возможно.

Поскольку я работаю с MVVM без фреймворка, и я очень плохо знаком с Xamarin и асинхронным программированием (я студент), мне было слишком сложно найти альтернативу конструктору.

Я опишу это как ответ, но если кто-то может привести пример кода, в котором можно было бы поместить метод в конструктор или обходной путь, это все еще очень приветствуется.

...