我正在处理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线程?
答案 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
集合来枚举和访问所有应用程序视图。