如何在Xamarin.Forms中同步执行异步方法

时间:2018-11-18 20:44:56

标签: c# .net xamarin.forms async-await tabbedpage

我正在xamarin中为我的应用程序构建一个屏幕。表单的原因是基于tabbedpage的,而tabbedpage是根据由于使用服务而获得的对象列表动态构建的。 调用使用带来列表的API的方法之后,我需要根据列表中的某些数据来遍历它,以填充可观察的viewmodel集合,这些视图将成为选项卡。我遇到的问题是,我不知道如何调用以同步方式使用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的目标为null(NullReferenceException)

2 个答案:

答案 0 :(得分:1)

由于您是在构造函数中执行此操作的,因此我将尝试以下操作:

using System.Threading.Tasks;

这里的风险是,如果您无法控制LoadThings的完成,它可能会挂起。

public MonitoringViewModel()
{
    var task = Task.Run(async () => { await LoadThings();}
    Task.WaitAll(task); //block and wait for task to complete

答案 1 :(得分:0)

public async Task<List<PcThing>> LoadThings()
{
    return await App.WebApiManager.GetCustomerThinksAsync();
}

在您的ViewModel中

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