我正在做一些关于多线程的任务。首先,我创建将使用套接字连接到服务器的表单1:clientSocket.Connect("127.0.0.1", 8888);
,然后我创建一个线程调用getMessage,它将侦听来自服务器的消息:
ctThread = new Thread(getMessage); ctThread.Start();
和getMessage函数在这里:
while (true)
{
serverStream = clientSocket.GetStream();
byte[] inStream = new byte[10025];
int buffSize = clientSocket.ReceiveBufferSize;
serverStream.Read(inStream, 0, buffSize);
string returndata = System.Text.Encoding.ASCII.GetString(inStream);
readData = "" + returndata;
if (readData.IndexOf("$") != -1)
{
readData = readData.Substring(0, readData.IndexOf("$"));
newFrm = new Form1();
newFrm.doNetworkMethod(readData);
}
}
然后我在Form2中为Form1创建doNetworkMethod以将数据发送到Form2,并在load2函数中的form2中创建doNetworkDelegate w = doNetworkMethod;
w.BeginInvoke(readData, null, null);
在此之前,我创建了2名代表public delegate void doNetworkDelegate(string readData);
public delegate void displayChatDelegate(string readData);
最后,我创建了2个函数调用:
public void doNetworkMethod(string readData)
{
if (readData != null)
{
if (!this.IsHandleCreated) this.CreateHandle();
this.Invoke(new displayChatDelegate(displayChatMethod), new object[] { readData.ToString() });
Thread.Sleep(1);
}
}
public void displayChatMethod(string readData)
{
lock (this)
{
textBox1.Text = textBox1.Text + readData;
textBox2.Text = textBox2.Text + readData;
}
}
但是textBox1
和textBox2
没有显示readData内容,但是当我创建MessageBox.show(readData)
时,它确实存在。
感谢您的帮助
答案 0 :(得分:2)
您无法在非UI线程中创建UI元素。
在newFrm = new Form1();
函数中调用的代码getMessage
需要在被调用之前编组回UI线程。