我正在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)
答案 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();