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