无法从winform中的线程更改UI

时间:2014-04-21 03:50:32

标签: c# multithreading winforms user-interface

我正在做一些关于多线程的任务。首先,我创建将使用套接字连接到服务器的表单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; 
        }
    }

但是textBox1textBox2没有显示readData内容,但是当我创建MessageBox.show(readData)时,它确实存在。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

您无法在非UI线程中创建UI元素。

newFrm = new Form1();函数中调用的代码getMessage需要在被调用之前编组回UI线程。