WindowsXamlManager.XamlShutdownCompletedOnThread Evento
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Si verifica al termine del processo di arresto del runtime XAML nel thread corrente.
// 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 evento
Esempio
In questo esempio viene illustrato come sottoscrivere l'evento per pulire gli oggetti quando XAML non è più in esecuzione nel thread.
In questo esempio sono disponibili alcuni tipi diversi di oggetti da pulire quando l'app viene arrestata. XAML include alcuni riferimenti indiretti ad alcuni di questi oggetti (ad esempio, oggetti "Model" come in un'app Model-View-ViewModel), quindi non vuoi eliminarli finché XAML non termina il lavoro. Sono disponibili anche alcuni oggetti che vengono puliti in un altro processo e si vuole attendere anche quelli.
Quindi, usi l'evento XamlShutdownCompletedOnThread e il relativo rinvio per organizzare il processo di arresto. Quando questo evento viene generato, si sa che XAML viene eseguito usando gli oggetti in questo thread. È anche possibile eseguire un rinvio in modo che l'arresto non venga completato fino al termine delle operazioni remote.
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();
});
Commenti
L'arresto del runtime XAML è associato alla sequenza di arresto di DispatcherQueue in esecuzione nel thread. Per altre info, vedi la documentazione di DispatcherQueue.
Quando un dispatcherQueue in un thread che usa XAML viene arrestato, questi eventi vengono generati nell'ordine seguente:
- Viene generato l'evento DispatcherQueue.ShutdownStarting . Destinato alle app da gestire.
- Viene generato l'evento DispatcherQueue.FrameworkShutdownStarting . Destinato ai framework da gestire.
- L'evento WindowsXamlManager.XamlShutdownCompletedOnThread viene generato in risposta a FrameworkShutdownStarting. Destinato alle app da gestire.
- Viene generato l'evento DispacherQueue.FrameworkShutdownCompleted . DispatcherQueue non è disponibile per il nuovo lavoro a questo punto.
- Viene generato l'evento DispacherQueue.ShutdownCompleted . DispatcherQueue non è disponibile per il nuovo lavoro a questo punto.
Al momento in cui viene generato l'evento WindowsXamlManager.XamlShutdownCompletedOnThread :
- XAML ha scaricato tutti gli oggetti XAML attivi e ha generato l'evento Unloaded per ogni oggetto.
- XAML non ha più alcun stato associato al thread corrente.
WindowsXamlManager.GetForCurrentThread restituisce
null
in questo momento. - DispatcherQueue nel thread corrente è ancora disponibile e utilizzabile. Si trova nella sequenza di arresto, quindi si noti che l'evento ShutdownStarting è già stato generato e non verrà generato di nuovo.
Nota
Anche se chiami Close sull'oggetto WindowsXamlManager o rilascia tutti i riferimenti, questo evento verrà comunque generato.