Получение CoreWindow
из CoreWindow::GetForCurrentThread()
будет работать только при вызове из потока пользовательского интерфейса, с которым связано окно.Вместо этого, когда вы находитесь в фоновом потоке, вы должны получить доступ к потоку пользовательского интерфейса по-другому:
Windows::ApplicationModel::Core::CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(
CoreDispatcherPriority::Normal,
ref new Windows::UI::Core::DispatchedHandler([this]()
{
TextBlock ^text_block = ref new TextBlock();
/* other code */
}));
Вместо этого он находит CoreWindow
основного представления вашего приложения и получает его диспетчер.Преимущество состоит в том, что этот подход не использует GetForCurrentThread
, поэтому вы можете использовать его даже из фонового потока.
Это становится проблемой, когда у вас открыто несколько представлений вашего приложения - тогда каждое представлениеимеет собственный поток пользовательского интерфейса , поэтому вы должны знать, какое представление модифицирует это действие, чтобы вы знали, какой диспетчер вы хотите использовать.В этом сценарии вы можете использовать коллекцию CoreApplication::Views
для перечисления и доступа ко всем представлениям приложения.