我正在做一些关于多线程的任务。首先,我创建表单 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,并在 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)
时,它会显示。
感谢您的帮助
不能在非 UI 线程中创建 UI 元素。
在getMessage
函数中调用的代码newFrm = new Form1();
需要在调用之前封送回 UI 线程。