当我的应用程序启动时,我如何在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库这是异步的

当我的应用程序启动时,我如何在Xamarin表单中调用此异步方法

就文档而言,您有可以覆盖的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();

…但我不推荐。