当我的应用首次启动时,我需要加载一些以前保存的数据。如果存在 - >然后转到TabbedPage页面。否则,登录页面。
我不确定如何在应用程序的ctor中调用我的异步方法,或者甚至用其他方法调用异步方法?
我该怎么做?
这是我的代码..
namespace Foo
{
public class App : Application
{
public App()
{
Page page;
LoadStorageDataAsync(); // TODO: HALP!
if (Account != null)
{
// Lets show the dashboard.
page = new DashboardPage();
}
else
{
// We need to login to figure out who we are.
page = CreateAuthenticationPage();
}
MainPage = page;
}
... snip ...
}
为什么LoadStorageDataAsync
异步?因为它是using the library PCLStorage而且都是异步的。
有人可以帮忙吗?
答案 0 :(得分:10)
As far as the docs say,您可以覆盖Application.OnStart
事件:
应用程序开发人员覆盖此方法以在执行操作时执行操作 申请开始。
您可以在那里实际等待的async
方法执行:
public override async void OnStart()
{
await LoadStorageDataAsync();
}
答案 1 :(得分:5)
退后一步,思考用户界面的工作原理。当您的应用程序最初显示时,框架构建您的ViewModel和View,然后它会立即显示 (尽快)。这对网络活动来说不合适。
相反,你应该做的是启动异步操作,然后(同步)加载并显示一个" loading"页。异步操作完成后,您可以转换到其他页面(如果用户没有网络访问权限,则可以转换到"错误"页面。)
我不确定Xamarin Forms是否能够对页面对象进行数据绑定,但如果是,则我的NotifyTaskCompletion
type可能会有所帮助。
答案 2 :(得分:2)
构造函数不能是async
,但事件处理程序可以是。如果可以,您应该将该逻辑移动到OnStart
事件处理程序(或更合适的处理程序):
public override async void OnStart (EventArgs e)
{
// stuff
await LoadStorageDataAsync();
// stuff
}
如果你不能,那么你没有比在该任务上同步阻止获得结果更好的选择。你应该知道,这可能导致死锁。
答案 3 :(得分:0)
在构造函数中使用异步方法被视为错误代码。您不应该在类构造函数中使用异步方法。
您可以尝试更改它以避免死锁:
Func<Task> task = async () => {
await YourCustomMethodAsync().ConfigureAwait(false);
};
task().Wait();
......但我不会推荐它。