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

时间:2015-07-30 13:08:55

标签: c# asynchronous async-await xamarin.forms

当我的应用首次启动时,我需要加载一些以前保存的数据。如果存在 - >然后转到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而且都是异步的。

有人可以帮忙吗?

4 个答案:

答案 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();

......但我不会推荐它。