C ++ / CX:使用分派器访问UI线程不起作用

时间:2018-12-21 18:19:56

标签: uwp c++-cx

我正在处理UWP应用程序,需要在非UI代码中使用TextBlock类。尝试实例化TextBlock对象会产生“ RPC_E_WRONG_THREAD(称为接口的应用程序,该接口已编组用于其他线程)”异常。 从我在Internet上收集的信息中,我了解到我应该在UI线程中执行代码。我使用了以下代码:

CoreDispatcher^ dispatcher = CoreWindow::GetForCurrentThread()->Dispatcher;

dispatcher->RunAsync(CoreDispatcherPriority::Normal, ref new DispatchedHandler
                                                            [/* captured variables */]() {
    TextBlock ^text_block = ref new TextBlock();
    /* other code */
});

问题是,尝试TextBlock实例化时,我会收到相同的异常。我在做什么错了?

UPD : 我刚刚意识到我正在从事的项目是DirectX UWP App。这是否意味着它不能直接访问UI线程?

1 个答案:

答案 0 :(得分:0)

只有从具有关联窗口的UI线程调用时,才能从CoreWindow获取CoreWindow::GetForCurrentThread()。相反,当您使用后台线程时,必须以其他方式访问UI线程:

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,因此即使在后台线程中也可以使用它。

当您打开应用的多个视图时,这会成为问题-每个视图都有其自己的UI线程,因此您必须知道此操作正在修改哪个视图,以便您知道哪个调度程序想要使用。在这种情况下,您可以使用CoreApplication::Views集合来枚举和访问所有应用程序视图。