Question

I'm having issues with my Windows Store App launch. When I use the "close app gesture" (slide the app from top to bottom) and then launch the app again very fast, sometimes a blank black screen appears and when I click on it, it, the Start menu appears, and a "MoAppHang" event is logged.

My App_Launched event code is here:

       protected override async void OnLaunched(LaunchActivatedEventArgs args)
    {
        if (args.PreviousExecutionState == ApplicationExecutionState.Terminated )
        {
            // Restore the saved session state only when appropriate
            await SuspensionManager.RestoreAsync();                
        }


        // Do not repeat app initialization when already running, just ensure that
        // the window is active
        if (args.PreviousExecutionState == ApplicationExecutionState.Running)
        {
            if (!string.IsNullOrEmpty(args.Arguments))
            {
                Frame f = Window.Current.Content as Frame;
                if (f != null)
                {
                    UseSecondaryTileNavigation(f, args.Arguments);
                }
            }
            Window.Current.Activate();
            return;
        }

        Frame rootFrame;
        if (Window.Current.Content == null)
        {

            // Create a Frame to act as the navigation context and associate it with
            // a SuspensionManager key
            rootFrame = new Frame();
            SuspensionManager.RegisterFrame(rootFrame, "AppFrame");
        }
        else
        {
            rootFrame = (Frame)Window.Current.Content;
        }

        if (!await DatabaseHelper.ExistsDatabase())
        {
            await DatabaseHelper.CreateDatabase();
        }

        if (rootFrame.Content == null)
        {
            // When the navigation stack isn't restored navigate to the first page,
            // configuring the new page by passing required information as a navigation
            // parameter
            if (!rootFrame.Navigate(typeof(ItemsPage), "AllGroups"))
            {
                throw new Exception("Failed to create initial page");
            }
        }

        if (!string.IsNullOrEmpty(args.Arguments))
        {
            UseSecondaryTileNavigation(rootFrame, args.Arguments);
        }

        // Place the frame in the current Window and ensure that it is active
        if (Window.Current.Content == null)
        {
            Window.Current.Content = rootFrame;
        }
        Window.Current.Activate();

The UseSecondaryTileNavigation performs navigation when user opens the app using secondary tile (it basically uses the Frame parameter and Navigates it to the correct location using Frame.Navigate).

Where am I going wrong?

Thank you all!

Was it helpful?

Solution

It looks like you could potentially be doing a bit of time-consuming work in your launch handler. The first suggestion I'd make is to use a custom splash screen technique. That is, in your OnLaunched handler try to set the Window.Current.Content and activate the window and get out of that method ASAP. You could set Window.Current.Content to a page that just shows a loading progress bar - and handle your actual loading logic in there.

The next thing to look at - is what happens when your app is launched while it is still suspending? (Do you have a suspending handler?) Can your app handle the case when it is (re-)launched before a previous suspension / close completes?

I've noticed that it generally seems to take a few seconds before the app is fully closed (even though you close it using the drag down gesture).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top