android .Net MAUI:异步初始化问题(async/await)

sqxo8psd  于 2022-11-27  发布在  Android
关注(0)|答案(1)|浏览(218)

下午好。我目前正在用. Net Maui和. Net Framework 7.0为Android和iOS构建一个应用程序(目前使用泛指el 5 Android Emulator),它应该会在启动时自动做一些事情(比如身份验证),然后相应地将用户重定向到相应的页面。
在我的startpage(StartPage.xaml.cs)中,我从视图模型调用初始化方法,如下所示:

protected override async void OnAppearing()
        => await _ViewModel.InitializeAsync();

视图模型中的初始化代码如下所示:

public async Task InitializeAsync()
{
    // ATTENTION: IF THE NEXT LINE IS COMMENTED OUT, EVERYTHING WORKS FINE.
    // HOWEVER, INSTEAD OF THE DELAY THIS IS THE PLACE I WOULD LIKE TO INITIALIZE THE APP (CALL SERVER, AUTHENTICATE ETC).
    await Task.Delay(1000);

    var user = new User();
    var parameters = NavigationService.GetParamsForObject(Tuple.Create("User", (object)user));

    // Go to the main page
    await NavigationService.GoToMainPage(parameters, true);
          
}

应用程序似乎可以正确启动,用户可以按预期重定向到"主"页面。但是,正如上面代码片段的注解中所提到的,等待任务.延迟(一千)"(我的实际初始化逻辑将发生的位置)导致在重定向的MainPage中出现TaskCancelledException(加载了带有自定义引脚的Map控件)。如果我注解掉"await Task. Delay(1000)"这行,一切都按预期工作。
在InitializeAsync-Method中使用wait-Statement有什么问题吗?我遗漏了什么吗?或者这只是(自动)初始化应用程序的错误位置?我不希望用户首先单击按钮,初始化应该自动发生。
非常感谢你的帮助。
我试探着:

  • MainThread。调用OnMainThread()来运行初始化逻辑
  • 使用调度程序
  • 捕获TaskCancelledException,但这会导致意外行为
  • 覆盖OnNavigatedFrom而不是OnApparing
gfttwv5a

gfttwv5a1#

在显示初始UI之前,您不能进行异步工作。您需要 * 开始 * 异步工作,然后(立即并同步地)显示某种类型的UI(例如,“正在加载...”屏幕)。然后,当您的异步工作完成时,用您的实际主UI更新/替换正在加载的UI。

相关问题