基本上,我正在尝试加载另一页,但是我需要另一种方法来完成初始化,因此在初始化时,ViewModel会调用服务器,因此我一直在等待,因为我需要其余的应用程序在继续之前最好等待,最好是异步等待。
try
{
Page Page = await Task.Run(() => ReturnPageToLoad(item));
if (Page != null)
{
PageToLoad = Page;
Device.BeginInvokeOnMainThread(() =>
{
try
{
Detail = PageToLoad;
_nav.SetLoadedPage(PageToLoad);
}
catch (Exception e)
{
Console.WriteLine($"Error in MainView: {e.Message}");
}
});
}
} catch (Exception e)
{
Console.WriteLine($"Error: {e.Message}");
}
我在try下方定义页面的地方,一旦一切都初始化了,这将返回一个页面给我,但是,我在多个地方都得到了null引用对象,有时代码可以在几次尝试下完全正常工作,这是什么呢?使我相信这是线程,如果我冲进去,它会崩溃,如果我放慢一点,通常是可以的。
我想做的是让其余的代码等到Page返回了某些内容。这可能吗?谢谢!
在ReturnPageToLoadItem方法中
try
{
if (item.MenuItemType == MenuItemType.Settings)
{
Page Loaded = _nav.ReturnPreLoadedPage(typeof(SettingsView));
await (Loaded.BindingContext as ViewModelBase).InitializeAsync(null);
if (_nav.returnLoadedPage() != Loaded.GetType())
{
return Loaded;
}
}
else if (item.MenuItemType == MenuItemType.MyTimetable)
{
Page Loaded = _nav.ReturnPreLoadedPage(typeof(TimetableView));
await (Loaded.BindingContext as ViewModelBase).InitializeAsync(null);
if (_nav.returnLoadedPage() != Loaded.GetType())
{
return Loaded;
}
}
else if (item.MenuItemType == MenuItemType.Support)
{
Page Loaded = _nav.ReturnPreLoadedPage(typeof(ChatView));
await (Loaded.BindingContext as ViewModelBase).InitializeAsync(null);
if (_nav.returnLoadedPage() != Loaded.GetType())
{
return Loaded;
}
}
else if (item.MenuItemType == MenuItemType.Applications)
{
return null;
}
else if (item.MenuItemType == MenuItemType.MyProfile)
{
Console.WriteLine("Doesn't exist yet");
return null;
}
else if (item.MenuItemType == MenuItemType.About)
{
Console.WriteLine("Doesn't exist yet");
return null;
}
else if (item.MenuItemType == MenuItemType.Home)
{
Page Loaded = _nav.ReturnPreLoadedPage(typeof(HomeView));
await (Loaded.BindingContext as ViewModelBase).InitializeAsync(null);
return Loaded;
}
}
catch (Exception e)
{
await Task.Delay(50);
Console.WriteLine($"Failed to load on attempt {retry}: {e.Message}");
retry--;
}
答案 0 :(得分:1)
初始化时,ViewModel会调用服务器,因此我一直在等待它,但是,因为我需要应用程序的其余部分在继续之前进行等待,最好是异步进行
我强烈建议始终将ViewModels初始化。唯一合理的方法是将其同步加载到“正在加载”状态(并启动对服务器的调用)。稍后,当要显示数据时,将VM 更新进入“已加载”状态。通过向用户显示“正在加载...”消息或微调框,而不是让他们等待远程呼叫完成,将为用户提供更好的体验。
我的article on async MVVM data binding和small helper library中的更多信息。