C#WebSocketSharp事件不允许我像标签文本那样更改WPF元素内容

时间:2017-03-07 12:13:59

标签: c# wpf visual-studio websocket

我正在使用C#WPF应用程序,该应用程序应该使用websocket连接并发送/接收一些数据包作为DATA ... 我在项目中使用了WebSocketSharp.dll并且一切正常,但在websocket事件中,例如ws.OnMessage,当我用一些字符串设置WPF标签时,它并没有改变任何东西。但MessageBox显示自己很好,在onOpen事件中,"已连接。" -string将以表格形式提交。

namespace Kolbeh
{
    public partial class MainWindow : Window
    {
        WebSocket ws = new WebSocket("ws://192.168.1.34:9093");
        public MainWindow()
        {
            InitializeComponent();
            label1.Content = "connecting...";

            ws.OnClose += (sender, e) = >
            {
                label1.Content = "closed.";
            };
            ws.OnError += (sender, e) = >
            {

            };
            ws.OnMessage += (sender, e) = >
            {
                Messagebox.show("Ok");
                label1.Content = "Received a packet";
            };
            ws.OnOpen += (sender, e) = >
            {
                label1.Content = "Connected.";
            };
            ws.Connect();
        }
    }
}

有什么问题?因为我需要从收到的消息中读取一些数据并将它们放入表格中。

1 个答案:

答案 0 :(得分:0)

WebSocket事件可能在非UI线程上引发,但WPF用户界面只能从UI线程更新。您可以使用Dispatcher来实现此目的。例如:

ws.OnMessage += (sender, e) =>
    {
        Dispatcher.BeginInvoke(new Action(() => label1.Content = "Received a packet"));
    };

更新。您询问了如何传递实际数据。据我所知,传递的数据是e参数。你可以在lambda中使用这个变量:

ws.OnMessage += (sender, e) =>
    {
        Dispatcher.BeginInvoke(new Action(() => 
        {
            label1.Content = "Received a packet";
            DoSomethingWithData(e);
        }));
    };