Как асинхронный метод может выполняться синхронно в Xamarin.Forms - PullRequest
0 голосов
/ 18 ноября 2018

Я создаю экран для своего приложения в xamarin.forms, поскольку он основан на странице с вкладками, которая создается динамически на основе списка объектов, которые я получаю в результате использования службы.После того, как я вызову метод для использования API, который выводит список, мне нужно просмотреть его на основе определенных данных, чтобы заполнить наблюдаемую коллекцию моделей представления, которые будут вкладками.У меня проблема в том, что я не знаю, как вызвать асинхронный метод, который использует API синхронизированным образом, чтобы использование API не конфликтовало с операцией просмотра списка.Затем часть кода моей ViewModel:

public MonitoringViewModel()
    {
        LoadThings();
        Tabs = new ObservableCollection<MonitoringTabsViewModel>();
        foreach (PcThing t in Things)
        {
            Tabs.Add(new MonitoringTabsViewModel(t.description));
        }
    }


    private async void LoadThings()
    {
        Things = new List<PcThing>(await App.WebApiManager.GetCustomerThinksAsync());
    }

Я получаю, что в xamarin live player приложение через несколько секунд переходит от зеленого сигнала к красному, ничего не показывая, и вЖурнал этого я получаю это: цель GetEnumerator является нулем (NullReferenceException)

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Поскольку вы делаете это в конструкторе, я бы попробовал следующее:

using System.Threading.Tasks;

Риск здесь, если вы не контролируете завершение LoadThings, он может зависнуть.

public MonitoringViewModel()
{
    var task = Task.Run(async () => { await LoadThings();}
    Task.WaitAll(task); //block and wait for task to complete
0 голосов
/ 19 ноября 2018
public async Task<List<PcThing>> LoadThings()
{
    return await App.WebApiManager.GetCustomerThinksAsync();
}

А в вашей ViewModel

Things = LoadThings().GetAwaiter().GetResult();
...