当我的应用程序启动时,我如何在Xamarin表单中调用此异步方法
本文关键字:表单 Xamarin 调用 异步方法 应用程序 我的 启动 | 更新日期: 2023-09-27 18:05:45
当我的应用程序第一次启动时,我需要加载一些以前保存的数据。如果存在->然后转到TabbedPage页面。否则显示登录页面。
我不确定如何在应用程序的函数中调用我的异步方法,甚至在另一个方法中?我该怎么做呢?
这是我的代码…
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
是异步的呢?因为它使用了PCLStorage库这是异步的
就文档而言,您有可以覆盖的Application.OnStart
事件:
应用程序开发人员重写此方法以执行操作应用程序启动.
你可以在那里执行你的async
方法,它实际上可以等待:
public override async void OnStart()
{
await LoadStorageDataAsync();
}
退后一步,思考一下UI是如何工作的。当你的应用程序最初显示时,框架会构造你的ViewModel和View,然后它会立即显示一些东西(尽可能快)。那不是进行网络活动的好地方。
相反,你应该做的是开始异步操作,然后(同步)加载并显示一个"正在加载"的页面。当异步操作完成后,您可以切换到其他页面(或者切换到"错误"页面,如果用户没有网络访问权限)。我不确定Xamarin Forms是否能够将数据绑定到页面对象,但如果是,那么我的NotifyTaskCompletion
类型可能会有所帮助。
构造函数不能是async
,但事件处理程序可以。如果可以,您应该将该逻辑移动到OnStart
事件处理程序(或更合适的一个):
public override async void OnStart (EventArgs e)
{
// stuff
await LoadStorageDataAsync();
// stuff
}
如果你不能,你没有更好的选择,而不是简单地同步阻塞该任务来获得结果。但是您应该注意,这可能会导致死锁。
在构造函数中使用异步方法被认为是糟糕的代码。不应该在类构造函数中使用异步方法。
您可以尝试更改它以避免死锁:
Func<Task> task = async () => {
await YourCustomMethodAsync().ConfigureAwait(false);
};
task().Wait();
…但我不推荐。