WindowsXamlManager.XamlShutdownCompletedOnThread Событие
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Происходит после завершения процесса завершения работы среды выполнения XAML в текущем потоке.
// 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)
Тип события
Примеры
В этом примере показано, как можно подписаться на событие для очистки объектов, когда XAML больше не выполняется в потоке.
В этом примере у вас есть различные типы объектов, которые нужно очистить по мере завершения работы приложения. XAML имеет некоторые косвенные ссылки на некоторые из этих объектов (например, объекты Model, такие как в приложении Model-View-ViewModel), поэтому вы не хотите уничтожать их, пока XAML не завершит свою работу. У вас также есть некоторые объекты, которые очищаются в другом процессе, и вы хотите подождать их.
Таким образом, вы используете событие XamlShutdownCompletedOnThread и его отсрочку для организации процесса завершения работы. При возникновении этого события известно, что XAML выполняется с помощью объектов в этом потоке. Вы также можете взять отсрочку, чтобы завершение работы не завершалось до завершения удаленных операций.
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();
});
Комментарии
Завершение работы среды выполнения XAML привязано к последовательности завершения работы DispatcherQueue , выполняемой в потоке. Дополнительные сведения см. в документации dispatcherQueue.
При завершении работы dispatcherQueue в потоке, использующего XAML, эти события вызываются в указанном порядке:
- Возникает событие DispatcherQueue.ShutdownStarting . Предназначен для обработки приложений.
- Возникает событие DispatcherQueue.FrameworkShutdownStarting . Предназначен для обработки платформ.
- Событие WindowsXamlManager.XamlShutdownCompletedOnThread возникает в ответ на FrameworkShutdownStarting. Предназначен для обработки приложений.
- Возникает событие DispacherQueue.FrameworkShutdownCompleted . На данный момент dispatcherQueue недоступен для новых работ.
- Возникает событие DispacherQueue.ShutdownCompleted . На данный момент dispatcherQueue недоступен для новых работ.
При возникновении события WindowsXamlManager.XamlShutdownCompletedOnThread :
- Xaml выгрузил все динамические объекты XAML и вызвал событие Unloaded для каждого объекта.
- XAML больше не имеет состояния, связанного с текущим потоком.
WindowsXamlManager.GetForCurrentThread возвращается
null
в настоящее время. - DispatcherQueue в текущем потоке по-прежнему доступна и доступна для использования. Он находится в последовательности завершения работы, поэтому обратите внимание, что событие ShutdownStarting уже было создано и больше не будет вызываться.
Примечание
Даже если вы вызовете Close для объекта WindowsXamlManager или отпустите все ссылки на него, это событие по-прежнему будет вызываться.