【问题标题】:How can I use async Method in Xamarin Forms when App starts?应用程序启动时如何在 Xamarin Forms 中使用异步方法?
【发布时间】:2017-12-15 13:02:00
【问题描述】:

我需要知道如何在应用启动时在 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());
                }
            }
        }

我在这些行中遇到错误

如果(等待 LoginPage.ConnectionCheck())

如果(等待 LoginPage.PasswordCheck(SaveCredential.UserName,SaveCredential.Password))

错误是

“await”运算符只能在异步方法中使用。考虑 用 'async' 修饰符标记这个方法并改变它的返回值 键入“任务”。

有人有解决办法吗?

【问题讨论】:

    标签: c# asynchronous xamarin xamarin.forms


    【解决方案1】:
        protected async override void OnStart()
        {
            base.OnStart();
    
            // call your async method here
        }
    

    【讨论】:

    • 我需要根据异步条件设置主页包。如果我将代码放在 Onstart 中,则 cod 正在运行但出现错误或 InitializeComponent();因为,public App()中没有Mainpage定义{}
    【解决方案2】:

    你不能在ctor中使用async/await,在msdn上通读async/await。

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

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

    或者您在 App.xaml.cs 的 ctor 中设置 App.Current.MainPage,然后在页面的 override asnyc void OnAppearing() 中等待您的逻辑。

    【讨论】:

      【解决方案3】:

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

      YourMethodAsync.GetAwaiter().GetResult();
      

      【讨论】:

        【解决方案4】:

        你可以这样做

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

        当您调用 Task.Run() 时,会创建一个新线程,您可以在该线程中调用 await 并在异步方法完成后调用 Device.BeginInvokeOnMainThread() 来更新 UI,因为只有主线程可以更新 UI。

        您还可以使用活动指示器向用户显示数据正在加载。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-06-25
          • 1970-01-01
          • 2018-12-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-03
          相关资源
          最近更新 更多