为什么从 SplashScreen 到 MainPage 的导航顺序不正确

Why incorrect order of navigation from SplashScreen to MainPage

我试图理解 example app by Microsoft. Now I can't repeat the next part. The app have classes App and ExtendedSplach。我想通过 ExtendedSplash 重复加载。在我的例子中,在一些延迟后从初始页面切换到主页很简单。

简介

这个例子就是这样做的。

如果应用在行 .Content = extendedSplash.Content = rootFrame 上运行断点,那么第一个断点将是 extendedSplash。但是 .Content = extendedSplash 行在 .Content = rootFrame 之后。构造函数 ExtendedSplash 调用 LoadDataAsync,首先设置 .Content = rootFram

但是,方法 LoadDataAsync 包含 await 调用

await Startup.ConfigureAsync();

我想这样第一会extendedSplash。我们将看到加载页面。

class应用程序

...
bool loadState = (e.PreviousExecutionState == ApplicationExecutionState.Terminated);
ExtendedSplash extendedSplash = new ExtendedSplash(e, loadState);
Window.Current.Content = extendedSplash;
Window.Current.Activate();

class ExtendedSplash

public ExtendedSplash(IActivatedEventArgs e, bool loadState)
{
    ...
    LoadDataAsync(this.activatedEventArgs);
}

private async void LoadDataAsync(IActivatedEventArgs e)
{
    ...
    rootFrame.Navigate(typeof(LoginView), shellArgs);
    Window.Current.Content = rootFrame;
    Window.Current.Activate();
}

问题

我试着重复一遍。我想查看 loading,然后切换到其他页面。但是我的断点案例看起来像第一个 .Content = rootFrame 和第二个 .Content = extendedSplash。因此,我的队列是延迟 5 秒的徽标应用程序,然后是 extendedSplash 的页面。页面 rootFrame 丢失。

如有任何帮助,我将不胜感激。

我的代码

我也做了同样的 App class

bool loadState = (e.PreviousExecutionState == ApplicationExecutionState.Terminated);
ExtendedSplash extendedSplash = new ExtendedSplash(e, loadState);
Window.Current.Content = extendedSplash;
Window.Current.Activate();

接下来是 ExtendedSplash

public ExtendedSplash(IActivatedEventArgs e, bool loadState)
{
    this.InitializeComponent();

    Window.Current.SizeChanged += new WindowSizeChangedEventHandler(ExtendedSplash_OnResize);

    this.splashScreen = e.SplashScreen;
    this.activatedEventArgs = e;

    OnResize();
    rootFrame = new Frame();
    LoadDataAsync(activatedEventArgs);
}

private async void LoadDataAsync(IActivatedEventArgs e)
{
    await Test();

    rootFrame.Navigate(typeof(MainPage));
    Window.Current.Content = rootFrame;
    Window.Current.Activate();
}

private async Task Test()
{
    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();
    while (stopwatch.ElapsedMilliseconds < 5000) ;
}

您的代码的问题实际上出在 Test() 方法中。您已标记为 async,但这不会使方法异步。相反,您的代码实际上会在 while 循环中以阻塞方式卡住五秒钟。

尝试以下版本:

private async Task Test()
{
    await Task.Delay(5000);
}

这种形式的代码实际上是异步的,因此UI线程可以同时显示启动画面。

通常 - 异步方法 运行 在调用它们的线程上,直到它们遇到 "actual" 异步代码 - 例如 I/O 绑定异步方法或当你 运行 你的代码 await Task.Run(()=>{...}.