WindowsXamlManager.XamlShutdownCompletedOnThread 이벤트
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
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-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 설명서를 참조하세요.
XAML을 사용하는 스레드의 DispatcherQueue 가 종료되면 다음 이벤트가 순서대로 발생합니다.
- DispatcherQueue.ShutdownStarting 이벤트가 발생합니다. 처리할 앱용입니다.
-
DispatcherQueue.FrameworkShutdownStarting 이벤트가 발생합니다. 처리할 프레임워크용입니다.
- WindowsXamlManager.XamlShutdownCompletedOnThread 이벤트는 FrameworkShutdownStarting에 대한 응답으로 발생합니다. 처리할 앱용입니다.
- DispacherQueue.FrameworkShutdownCompleted 이벤트가 발생합니다. 현재 새 작업에는 DispatcherQueue 를 사용할 수 없습니다.
- DispacherQueue.ShutdownCompleted 이벤트가 발생합니다. 현재 새 작업에는 DispatcherQueue 를 사용할 수 없습니다.
WindowsXamlManager.XamlShutdownCompletedOnThread 이벤트가 발생할 때:
- XAML은 모든 라이브 XAML 개체를 언로드하고 각 개체에 대해 Unloaded 이벤트를 발생시켰습니다.
- XAML에는 현재 스레드와 연결된 상태가 더 이상 없습니다.
WindowsXamlManager.GetForCurrentThread 는 현재 를 반환합니다
null
. - 현재 스레드의 DispatcherQueue 는 여전히 사용할 수 있으며 사용할 수 있습니다. 종료 시퀀스에 있으므로 ShutdownStarting 이벤트가 이미 발생했으며 다시 발생하지 않습니다.
참고
WindowsXamlManager 개체에서 Close를 호출하거나 모든 참조를 해제하더라도 이 이벤트는 계속 발생합니다.