特定のスレッドに切り替えるのに GUI は必要ありません。代わりに、エントリ時に呼び出しコンテキストをキャプチャし、いつでもそれに切り替えることができます。これについては、スレッド アフィニティを念頭に置いたプログラミングで、コード例とともに説明されています。
IAsyncAction DoWorkAsync(TextBlock textblock)
{
winrt::apartment_context ui_thread; // Capture calling context.
co_await winrt::resume_background();
// Do compute-bound work here.
co_await ui_thread; // Switch back to calling context.
textblock.Text(L"Done!"); // Ok if we really were called from the UI thread.
}
または、 DependencyObjectにアクセスできる場合は、そのDispatcherプロパティを使用してwinrt::resume_foreground
クラスで使用できます。
IAsyncAction DoWorkAsync(DependencyObject targetObject)
{
co_await winrt::resume_background();
// Do compute-bound work here.
co_await winrt::resume_foreground(targetObject.Dispatcher());
// Raise INotifyPropertyChanged event.
}
同様に、コルーチンからCoreDispatcher.RunAsyncメソッドを呼び出して、それぞれを所有するスレッドでPropertyChangedDependencyObject
イベントを発生させることができます。
IAsyncAction DoWorkAsync(DependencyObject targetObject)
{
co_await winrt::resume_background();
// Do compute-bound work here.
co_await targetObject.Dispatcher().RunAsync(CoreDispatcherPriority::Normal,
[=]()
{
// Raise event
});
// Continue work
}