首页 > 解决方案 > 如何为结果进行等待异步任务以进一步操作 xamarin 表单?

问题描述

在我的 Xamarin.Forms 应用程序中,我使用 azure 移动服务进行离线数据同步。

在我的应用程序的 OnStart 方法中,我正在调用异步任务,并且根据任务的结果,我需要加载不同的页面。不幸的是,现在没有页面正在加载。当我删除对异步任务的调用时,页面正在加载。

OnStart 方法

protected async override void OnStart()
{
    login = new List<Login>();
    List<Login> items = await App.dataManager.GetLoginAsync();

    if (items.Count <= 0)
    {
        MainPage = (new Registration());
    }
    else
    {
        MainPage = (new LoginPage());
    }
}

异步任务方法

public async Task<List<Login>> GetLoginAsync()
{
    try
    {   
        IEnumerable<Login> items = await logins
            .ToEnumerableAsync();
        return new List<Login>(items);
    }
    catch (MobileServiceInvalidOperationException msioe)
    {
        Debug.WriteLine(@"Invalid sync operation: {0}", msioe.Message);
    }
    catch (Exception e)
    {
        Debug.WriteLine(@"Sync error: {0}", e.Message);
    }
    return null;
}

标签: c#azurexamarin.formsasync-await

解决方案


由于MainPage 属性应该在 App 构造函数中设置,并且我们不应该通过在构造函数中等待异步方法来阻塞 UI 线程,您可以这样实现导航逻辑:

在 App 的构造函数中设置 MainPage 如下:

MainPage = new StarterPage();

在 StarterPage 的 OnAppearing 方法中:

protected override async void OnAppearing()
{
    base.OnAppearing();

    login = new List<Login>();

    //show ActivityIndicator

    List<Login> items = await App.dataManager.GetLoginAsync();

    //hide ActivityIndicator

    if (items.Count <= 0)
    {
        await Navigation.PushAsync(Registration);
    }
    else
    {
        await Navigation.PushAsync(LoginPage);
    }
}

推荐阅读