从Windows应用商店应用中的socketIO接收数据时添加UI元素

时间:2014-10-24 16:08:03

标签: c# windows-phone-8 windows-store-apps windows-phone-8.1

我有这个问题。我有一个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"
                    });
                 });

我很感激您提供的任何暗示或帮助!谢谢。 (希望其他人修复此问题)

1 个答案:

答案 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线程,并创建按钮。

代码最终会以更好的方式结束:)