2013-05-07 41 views
0


我遇到了一个奇怪的问题。我为使用C#编写的程序使用SocketIO4Net客户端。该程序与使用NodeJS & SocketIO写入的服务器进行通信。我可以在我的程序&服务器之间使用'socket.emit()'&'socket.On()'方法在SocketIO4NET客户端中发送&接收数据。但是,当我尝试更新从服务器收到的数据在GUI中的文本框时,没有任何反应。但是,如果我使用'MessageBox.Show()'方法,我可以显示我收到的数据。我使用下面的代码用于接收数据:C#文本框与SocketIO4NET一起使用时未更新

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); 
    } 

上面的代码工作正常。但它不更新文本框'rxtxtbox'。如果我将行“rxtxtbox.Text = msg;”在“MessageBox.Show();”之上,接收“消息”事件时不会发生任何事情。我试着设置断点&看着变量“msg”的值为&其罚款。我试着宣布另一个功能只是为了更新文本框&,将“msg”传递给它&仍然没有结果!我认为这与等待“消息”事件有关?我试过“Application.DoEvents()”和“rxtxtbox.Refresh()”方法&仍然没有运气!我是C#的新手。请帮忙!

+0

亲爱的Aravid我下载了你的文件,我做了一些更改,因为我在我的服务器上运行节点代码,我根据我的服务器代码更新了发送功能,这是更新, – 2015-01-24 13:10:32

+0

但我是我的rxtbox.Text不是点击发送按钮后修改。 – 2015-01-24 13:11:48

+0

@syed:请检查以下解决方案 – 2015-01-24 17:37:18

回答

0

您提到,如果将MessageBox.Show放置在rxtxtbox.Text的前面 - 您会看到有效内容数据,但首先显示rxtxtbox.Text - 完全没有任何事情发生。

来自socketIO4Net的事件肯定会在后台线程上运行,所以我敢打赌你会抛出一个更新UI控件的异常 - 从这个非UI线程。我对MessageBox的理解是它没有绑定到UI,所以它可以从非UI线程无w/o问题中调用。

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

它使用了一种名为拉姆达明确创建将拥有该控件的线程上执行匿名委托(文本框:

到位您rxtxtbox.Text =味精线试试这个在这种情况下)底层句柄。

你也可以将此行更新权之前的Text属性,并检查它(如果是真的,你确实是在非UI线程,并且已经找到了你的问题):

bool state = rxtxtbox.InvokeRequired; 

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

+0

谢谢@ user1168541!这解决了我的问题!你是对的,它正在抛出一个异常'无效的跨线程操作'。 – 2013-05-08 02:30:46