2014-04-21 3 views
1

다중 스레드에 대한 일부 작업을 수행하고 있습니다. 그때winform의 스레드에서 UI를 변경할 수 없습니다.

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

:
ctThread = new Thread(getMessage); ctThread.Start();
여기에서의 getMessage 기능 :
은 그때 서버에서 메시지를들을 것이다 스레드 호출의 getMessage를 작성, clientSocket.Connect("127.0.0.1", 8888); : 첫째, 소켓 서버에 연결 형태로 만들기 1 Form1에이 Form2로 데이터를 전송하는 형식 2에 doNetworkMethod을 만들고,로드 이벤트 함수를 Form2에 나는 그 전에, 나는이 위임
public delegate void doNetworkDelegate(string readData); public delegate void displayChatDelegate(string readData);
을 만들고 마지막으로, 나는 2 FUNC를 만들어
doNetworkDelegate w = doNetworkMethod; w.BeginInvoke(readData, null, null);

이 기 전화 :

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)을 만들 때 않습니다.

도움 주셔서 감사합니다.

답변

2

UI가 아닌 스레드에서는 UI 요소를 만들 수 없습니다.

getMessage 함수에서 호출 된 코드 newFrm = new Form1();을 호출하기 전에 UI 스레드로 마샬링해야합니다.

관련 문제