다음을 통해 공유


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-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 가 종료되면 다음 이벤트가 순서대로 발생합니다.

WindowsXamlManager.XamlShutdownCompletedOnThread 이벤트가 발생할 때:

  • XAML은 모든 라이브 XAML 개체를 언로드하고 각 개체에 대해 Unloaded 이벤트를 발생시켰습니다.
  • XAML에는 현재 스레드와 연결된 상태가 더 이상 없습니다. WindowsXamlManager.GetForCurrentThread 는 현재 를 반환합니다 null .
  • 현재 스레드의 DispatcherQueue 는 여전히 사용할 수 있으며 사용할 수 있습니다. 종료 시퀀스에 있으므로 ShutdownStarting 이벤트가 이미 발생했으며 다시 발생하지 않습니다.

참고

WindowsXamlManager 개체에서 Close를 호출하거나 모든 참조를 해제하더라도 이 이벤트는 계속 발생합니다.

적용 대상