当应用程序启动时,我如何在Xamarin Forms中使用异步方法?

3

我需要知道如何在Xamarin Forms中使用异步方法来启动应用程序?我需要根据条件显示前面的页面。

public App()
        {
            InitializeComponent();

            if (SaveCredential.IpAddress == string.Empty || SaveCredential.PortNo == string.Empty)
            {
                MainPage = new NavigationPage(new Dhoni.IpDetail());
            }

            else if (SaveCredential.IpAddress != string.Empty && SaveCredential.PortNo != string.Empty)
            {
                if (await LoginPage.ConnectionCheck())

                {
                    if (SaveCredential.UserName != string.Empty && SaveCredential.Password != string.Empty)
                    {
                        if (await LoginPage.PasswordCheck(SaveCredential.UserName, SaveCredential.Password))
                        {
                            MainPage = new NavigationPage(new Dhoni.Dashboard());
                        }
                        else
                        {
                            MainPage = new NavigationPage(new Dhoni.LoginPage());
                        }
                    }
                    else if (SaveCredential.UserName == string.Empty || SaveCredential.Password == string.Empty)
                    {
                        MainPage = new NavigationPage(new Dhoni.LoginPage());
                    }

                }
                else
                {
                    MainPage = new NavigationPage(new Dhoni.IpDetail());
                }
            }
        }

我在这些行中遇到了错误

if (await LoginPage.ConnectionCheck())

if (await LoginPage.PasswordCheck(SaveCredential.UserName,SaveCredential.Password))

错误信息为:

“await”运算符只能在异步方法内使用。请考虑使用“async”修饰符标记此方法,并将其返回类型更改为“Task”。

有没有解决方案?


请查看以下链接:https://www.xamarinhelp.com/xamarin-forms-async-task-startup/ - user193679
4个回答

7
    protected async override void OnStart()
    {
        base.OnStart();

        // call your async method here
    }

我需要根据异步条件设置主页。如果我将代码放在Onstart中,代码会运行但会出现错误或InitializeComponent(); 因为,在public App(){}中没有Mainpage定义。 - Ganeshgm7

1

您无法在构造函数中使用async/await,请在msdn上阅读有关async/await的内容。

您有两个选择,要么覆盖OnStartOnResume(还有OnSleep),并将它们设置为异步:

protected override async void OnStart() { //await ... }

或者您可以在App.xaml.cs的ctor中设置App.Current.MainPage,然后在页面的重写异步方法OnAppearing()中等待您的逻辑。

0

你可以做到这个

Task.Run(async () =>
{
    //--- async code ---
    Device.BeginInvokeOnMainThread(() => {
        //--- update UI ---
    });
});

当调用Task.Run()时,会创建一个新线程,您可以在该线程中调用await,并在异步方法完成后调用Device.BeginInvokeOnMainThread() 来更新UI,因为只有主线程才能更新UI。
此外,您可以使用活动指示器来向用户显示数据正在加载。

0

如果你真的需要这样做(但我建议不要):

YourMethodAsync.GetAwaiter().GetResult();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接