我有这个问题。我有一个SocketIO服务器和一个Windows应用程序,它将数据发送到服务器,但是当我从服务器收到一些东西并尝试更新UI时,我收到了这个错误: 如果我没有更新UI,并发回消息,它可以工作,当我触摸UI元素时会出现问题。
类型' System.Exception'的例外情况发生在LiftMeApp中 Prototype.exe但未在用户代码中处理
附加信息:该应用程序称为接口 为不同的线程编组。 (HRESULT的例外情况:0x8001010E (RPC_E_WRONG_THREAD))
这是我的代码:
socket.On("hi", (data) =>
{
this.LayoutRoot.Children.Add(new TextBlock()
{
Text = "a button"
});
});
我很感激您提供的任何暗示或帮助!谢谢。 (希望其他人修复此问题)
答案 0 :(得分:1)
在所有.NET代码中(包括WinForms,WPF和是,Windows Store);影响UI 的操作必须在UI线程上进行。您的套接字正在调整一个读取线程(这就是为什么它在等待数据时不会阻止UI)所以您的UI更改需要编组到UI线程。
这通常使用Dispatcher.BeginInvoke
:
Dispatcher.BeginInvoke(new Action(() =>
{
//Code for UI
}), null);
对于Windows手机,您需要使用(来自@Johan Falk来源:https://stackoverflow.com/a/23607262/1783619):
CoreDispatcher dispatcher = CoreWindow.GetForCurrentThread().Dispatcher;
await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { });
在您的情况下,使用MVVM并使用按钮项模板进行项控制可能会更好。然后,您可以添加到绑定集合,它将为您修改更改到UI线程,并创建按钮。
代码最终会以更好的方式结束:)