我有一个奇怪的问题。我正在使用SocketIO4Net Client来编写用C#编写的程序。该程序与NodeJS编写的服务器进行通信。 SocketIO。我能发送&在我的程序和我之间接收数据服务器使用'socket.emit()'& SocketIO4NET客户端中的'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#的新手。请帮忙!
答案 0 :(得分: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属性之前放置此行,并检查它(如果为true,那么您确实在非ui线程上,并且发现了您的问题):
bool state = rxtxtbox.InvokeRequired;
有多种方法可以处理来自非ui线程的GUI更新。在SO上搜索多线程winforms gui C#等。从socketio4net引发的任何消息都需要正确处理,否则您将抛出UI线程异常。