gpt4 book ai didi

c# - 在启动时执行异步任务

转载 作者:行者123 更新时间:2023-12-03 12:59:24 25 4
gpt4 key购买 nike

我想使用Xamarin接下来执行:

当应用程序启动时,

  • 会立即显示splashScreen(在下一个教程https://channel9.msdn.com/Blogs/MVP-Windows-Dev/Using-Splash-Screen-with-Xamarin-Forms下,我已经实现了此功能)
  • 执行数据库迁移(如果有的话)(以防用户更新了应用程序并首次运行它)
  • 从db读取用户数据(用户名和密码),调用REST Web服务以检查用户数据是否仍然有效。如果用户数据有效,则将用户重定向到MainPage,否则将用户重定向到LoginPage

  • 我已经阅读了有关 Xamarin.Forms Async Task On Startup的下一篇好文章。当前代码:
    public class MainActivity :global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
    {
    protected override void OnCreate (Bundle bundle)
    {
    base.OnCreate (bundle);
    global::Xamarin.Forms.Forms.Init (this, bundle);
    LoadApplication (new App ()); // method is new in 1.3
    }
    }

    // shared code - PCL lib for Android and iOS
    public partial class App : Application
    {
    public App()
    {
    InitializeComponent();
    // MainPage = new LoadingPage();
    }
    }
    protected override async void OnStart()
    {
    // Handle when your app starts
    await App.Database.Migrations();
    if( await CheckUser()) // reads user data from db and makes http request
    this.MainPage = new Layout.BrowsePage();
    else
    this.MainPage = new LoginPage();
    }

    如果未在构造函数中设置 MainPage,则在iOS和Android上引发异常。我知道,如果异步void没有明确包含 .Wait(),它不会等待-
    Async void,但这是否意味着执行线程仍在继续工作。

    当执行线程命中 await App.Database.Migrations();时,它将暂停执行并等待await Task完成。同时,它继续工作(即LoadApplication()继续执行,并期望App.MainPage现在已设置)。我的 假设正确吗吗?

    我只想避免 LoadingPage,因为显示了三个屏幕:
  • 启动画面(在启动应用程序时正确显示)
  • LoadingPage(数据库迁移,http请求,..)
  • BrowsePage或LoginPage

  • 为了用户体验,最好只有两页。

    我最终是这样,但我相信有更好的方法:
    protected override void OnStart()
    {
    Page startPage = null;
    Task.Run(async() =>
    {
    await App.Database.Migrations();
    startPage = await CheckUser() ? new Layout.BrowsePage() : new LoginPage();
    }.Wait();
    this.MainPage = startPage();
    }

    最佳答案

    好吧,您可以将所有内容放入App构造函数中,并且在加载应用程序时,初始屏幕将显示更长的时间,但我实际上认为这是次等的解决方案。

    拥有一个与启动画面完全相似的启动画面,然后是一个加载页面,但是带有进度条或加载图标(告诉用户正在执行的操作)是一种更好的方法。

    如果必须在用户看到第一页之前执行此操作,则加载屏幕是一个不错的选择,可以让用户知道为什么花这么长时间。

    我唯一要添加的是存储已加载的数据库的 bool 值或版本号,因此除非您的应用程序版本增加,否则您无需运行该迁移代码。

    通过这样做,您可以将此 bool 检查放入您的App构造函数中,并立即加载第一页。如果需要迁移,请加载加载页面,并让OnStart完成迁移,然后加载第一个应用程序屏幕。

    关于c# - 在启动时执行异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46244551/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com