我有一个奇怪的问题。我使用SocketIO4Net客户端来编写用C#编写的程序。该程序使用NodeJS&SocketIO。我可以发送&在我的程序&使用'socket.emit(('&'的服务器插座SocketIO4NET客户端中的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"rxxtbox"。如果我将行"rxxtbox.Text=msg;"移到"MessageBox.Show((;"上方,则在接收"message"事件时不会发生任何事情。我试着设置断点&观察变量"msg"的值&很好。我尝试声明另一个函数只是为了更新文本框&将"msg"传递给它&仍然没有结果!我认为这和等待"消息"事件有关?我尝试了"Application.DoEvents(("one_answers"rxxtbox.Refresh(("方法&仍然没有运气!我是C#的新手。请帮忙!
您提到,如果将MessageBox.Show放在rxxtbox前面。文本-您可以看到有效负载数据,但有rxxtbox。先发短信-什么都没发生。
socketIO4Net中的事件处理程序肯定是在后台线程上运行的,所以我敢打赌你是在从这个非UI线程更新UI控件时抛出异常。我对MessageBox的理解是,它没有绑定到UI,所以它可以从没有问题的非UI线程中调用。
试试这个来代替你的rxxtbox。文本=消息行:
rxtxtbox.Invoke(new Action(() => rxtxtbox.Text = msg)));
这使用一种称为lambda表达式的东西来创建一个匿名委托,该委托将在拥有控件(本例中为文本框(基础句柄的线程上执行。
您也可以在更新Text属性之前放置此行,并对其进行检查(如果为true,则表明您确实在非ui线程上,并且已经发现了问题(:
bool state = rxtxtbox.InvokeRequired;
有多种方法可以处理来自非ui线程的GUI更新。在SO上搜索多线程winformsgui C#等。从socketio4net引发的任何消息都需要适当处理,否则会引发UI线程异常。