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 アプリのような "Model" オブジェクト) への間接的な参照があるため、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 を呼び出すか、そのオブジェクトへのすべての参照を解放しても、このイベントは引き続き発生します。

適用対象