0


我有一个奇怪的问题。我正在为我用 C# 编写的程序使用 SocketIO4Net 客户端。该程序与用 NodeJS 和 SocketIO 编写的服务器通信。我可以使用 SocketIO4NET 客户端中的 'socket.emit()' 和 'socket.On()' 方法在我的程序和服务器之间发送和接收数据。但是,当我尝试使用从服务器接收到的数据更新 GUI 中的文本框时,什么也没有发生。但是,如果我使用 'MessageBox.Show()' 方法,我可以显示我收到的数据。我正在使用以下代码来接收数据:

public Form1()
    {
        InitializeComponent();
        socket = new Client("http://127.0.0.1:80/");
        socket.On("message", (data) =>
        {
             String msg = data.Json.Args[0].ToString();
             MessageBox.Show(msg,"Received Data");
             rxtxtbox.Text = msg;


        });
        socket.Connect();
    }

对于发送数据:

 private void sendbtn_Click(object sender, EventArgs e)
    {
        String msg = msgtxtbox.Text.ToString();
        socket.Emit("private message", msg);
    }

上面的代码工作正常。但它没有更新 TextBox 'rxtxtbox'。如果我移动“rxtxtbox.Text = msg;”行 在“MessageBox.Show();”之上,那么在接收到“message”事件时不会发生任何事情。我尝试设置断点并查看变量“msg”的值及其正常。我尝试声明另一个函数只是为了更新文本框并将“msg”传递给它,但仍然没有结果!我认为这与等待“消息”事件有关吗?我尝试了“Application.DoEvents()”和“rxtxtbox.Refresh()”方法,但仍然没有运气!我是 C# 的新手。请帮忙!

4

1 回答 1

0

您提到,如果将 MessageBox.Show 放在 rxtxtbox.Text 前面 - 您会看到有效负载数据,但首先使用 rxtxtbox.Text - 什么都不会发生。

来自 socketIO4Net 的事件处理程序肯定在后台线程上运行,所以我敢打赌你会抛出一个更新 UI 控件的异常 - 从这个非 UI 线程。我对 MessageBox 的理解是它不依赖于 UI,因此可以从非 UI 线程调用它而不会出现问题。

试试这个代替你的 rxtxtbox.Text = msg 行:

rxtxtbox.Invoke(new Action(() => rxtxtbox.Text = msg)));

这使用称为 lambda express 的东西来创建一个匿名委托,该委托将在拥有控件(在本例中为文本框)底层句柄的线程上执行。

您也可以在更新 Text 属性之前放置此行并检查它(如果为真,您确实在非 ui 线程上,并且发现了您的问题):

bool state = rxtxtbox.InvokeRequired;

有多种方法可以处理来自非 ui 线程的 GUI 更新。在 SO 上搜索多线程 winforms gui C# 等。从 socketio4net 引发的任何消息都需要适当处理,否则您将引发 UI 线程异常。

于 2013-05-07T20:23:53.717 回答