Compartir a través de


WindowsXamlManager.XamlShutdownCompletedOnThread Evento

Definición

Se produce cuando el tiempo de ejecución xaml ha finalizado su proceso de apagado en el subproceso actual.

// Register
event_token XamlShutdownCompletedOnThread(TypedEventHandler<WindowsXamlManager, XamlShutdownCompletedOnThreadEventArgs const&> const& handler) const;

// Revoke with event_token
void XamlShutdownCompletedOnThread(event_token const* cookie) const;

// Revoke with event_revoker
WindowsXamlManager::XamlShutdownCompletedOnThread_revoker XamlShutdownCompletedOnThread(auto_revoke_t, TypedEventHandler<WindowsXamlManager, XamlShutdownCompletedOnThreadEventArgs const&> const& handler) const;
public event TypedEventHandler<WindowsXamlManager,XamlShutdownCompletedOnThreadEventArgs> XamlShutdownCompletedOnThread;
function onXamlShutdownCompletedOnThread(eventArgs) { /* Your code */ }
windowsXamlManager.addEventListener("xamlshutdowncompletedonthread", onXamlShutdownCompletedOnThread);
windowsXamlManager.removeEventListener("xamlshutdowncompletedonthread", onXamlShutdownCompletedOnThread);
- or -
windowsXamlManager.onxamlshutdowncompletedonthread = onXamlShutdownCompletedOnThread;
Public Custom Event XamlShutdownCompletedOnThread As TypedEventHandler(Of WindowsXamlManager, XamlShutdownCompletedOnThreadEventArgs) 

Tipo de evento

Ejemplos

En este ejemplo se muestra cómo podría suscribirse al evento para limpiar los objetos cuando XAML ya no se ejecuta en el subproceso.

En este ejemplo, tiene algunos tipos diferentes de objetos que desea limpiar a medida que se cierra la aplicación. XAML tiene algunas referencias indirectas a algunos de estos objetos (por ejemplo, objetos "Model", como en una aplicación Model-View-ViewModel), por lo que no quieres destruirlos hasta que XAML haya terminado con su trabajo. También tiene algunos objetos que se limpian en otro proceso, y también desea esperarlos.

Por lo tanto, usas el evento XamlShutdownCompletedOnThread y su aplazamiento para organizar el proceso de apagado. Cuando se genera este evento, ya sabes que XAML se realiza mediante los objetos de este subproceso. También puede tomar un aplazamiento para que el apagado no se complete hasta que finalicen las operaciones remotas.

WindowsXamlManager manager = WindowsXamlManager::GetForCurrentThread();
manager.XamlShutdownCompletedOnThread([](
    const WindowsXamlManager& sender,
    const XamlShutdownCompletedOnThreadEventArgs& args) -> IAsyncAction
    {
        // Once we get this deferral, the DispatcherQueue shutdown process
        // won't continue until Complete is called.
        // Until we call deferral.Complete(), we can still use the 
        // DispatcherQueue and give it new work.
        auto deferral = args.GetDispatcherQueueDeferral();

        // Now that XAML has shutdown, we can clean up any of our objects
        // that XAML might have been using.
        CleanupUIThreadObjects();

        // Capture the UI thread context.
        winrt::apartment_context ui_thread;

        // We can also do cleanup work that might take a while. For example, 
        // we can wait for work in other processes to finish.
        co_await CleanupRemoteObjects();

        // Switch back to the UI thread, in case we have any UI-thread work left to do.
        // It will still be running because we took the deferral.
        co_await ui_thread;

        // Done! Shutdown may continue.
        deferral.Complete();
    });

Comentarios

El apagado del tiempo de ejecución xaml está vinculado a la secuencia de apagado de DispatcherQueue que se ejecuta en el subproceso. Para obtener más información, consulta la documentación de DispatcherQueue.

Cuando un DispatcherQueue en un subproceso que usa XAML está apagado, estos eventos se generan en orden:

En el momento en que se genera el evento WindowsXamlManager.XamlShutdownCompletedOnThread :

  • XAML ha descargado todos los objetos XAML activos y ha generado el evento Unloaded para cada objeto.
  • XAML ya no tiene ningún estado asociado al subproceso actual. WindowsXamlManager.GetForCurrentThread devuelve null en este momento.
  • DispatcherQueue en el subproceso actual sigue estando disponible y utilizable. Está en su secuencia de apagado, por lo que tenga en cuenta que el evento ShutdownStarting ya se ha generado y no se volverá a generar.

Nota

Incluso si llamas a Close en el objeto WindowsXamlManager o liberas todas las referencias a él, este evento se seguirá produciendo.

Se aplica a