我写了一个SOCKET 服务器端的程序,在接收数据时,由于不是窗体线程,怎么在线程里面给窗体控件 textBox1 赋值呀?????听说委托可以做到,怎么做呀???? public class Server : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
                  private System.Windows.Forms.Button button2;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.Button button3;   
         /// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
        
static int maxCount = 50; //最大连接数
string port = "10000";     //端口号
                  private Thread clientHandleThread;
                  public TextBox textBox1;
                  private Socket serverSocket; private void InitializeComponent()
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main() 
{
Application.Run(new Server());
} private void button1_Click(object sender, System.EventArgs e)
{
try
{   
this.button1.Enabled= false;
                                     serverSocket =new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);   
                IPHostEntry serverIP = Dns.GetHostEntry(Dns.GetHostName());                                              IPEndPoint serverHost = new IPEndPoint(serverIP.AddressList[0], Int32.Parse(port));                      serverSocket.Bind(serverHost);                                                            
                serverSocket.Listen(maxCount);                                                                            textBox1.Clear();
                textBox1.Text += "已经建立服务器SOCKET线程,正在监听10000端口" + "\r\n" ;                 clientHandleThread = new Thread(new ThreadStart(listen));
                clientHandleThread.Start();
                
}
catch(Exception ex)
{
             MessageBox.Show("error",ex.Message.ToString());
}
    }        private void listen()
        {
            byte[] recv = new byte[1024];
            System.Net.Sockets.Socket handle;
            handle = serverSocket.Accept();
            while (true)
            {
                if (handle.Connected)
                {
                    textBox1.Text += "已经连接上一个客户端发来的连接!";//就这里出错!
                    handle.Receive(recv);
                    textBox1.Text += BitConverter.ToString(recv, 0);//就这里出错!
                }
            }
        } private void button3_Click(object sender, System.EventArgs e)
{
                         clientHandleThread.Abort(); //中止线程
                         serverSocket.Close();
      //Appliend.ExitThread();
} }
}

解决方案 »

  1.   

    怎么解决下面出错的地方呀,
    怎么用委托解决呀?textBox1.Text += "已经连接上一个客户端发来的连接!";//就这里出错!
    handle.Receive(recv);
    textBox1.Text += BitConverter.ToString(recv, 0);//就这里出错!
      

  2.   

    http://blog.csdn.net/chendazhi/archive/2006/05/09/715064.aspx
      

  3.   

    那么我要在线程中把收到的数据赋给textBox1 应该怎样做呀?有人能贴一些代码出来看看吗?
      

  4.   

    不能直接赋值,参看
    http://blog.csdn.net/knight94/archive/2006/03/16/626584.aspx
    中提到的invoke方法。
      

  5.   

    TO: newnan(神出鬼没)
    怎么在线程里面以事件的方式委托给控件所在的线程处理?????????????
      

  6.   

    public delegate void changetextdelegate(string str)changetextdelegate d=new changetextdelegate(changetext);
    d.begindelegate("已经连接上一个客户端发来的连接!",null,null);
     handle.Receive(recv);
    d.begindelegate(BitConverter.ToString(recv, 0),null,null);public void changetext(string str)
    {
    textBox1.Text +=str;
    }
      

  7.   

    static void Main() 
    {
    Application.Run(new Server());
                   //加上下面这一句!用于取消线程冲突验证。所有的跨线程都不验证了。
                   //但是弱点是隐患比较大,有冲突时调试也不会报错。
                   //适合少量线程并且调用关系简单的程序使用!
                               Control.CheckForIllegalCrossThreadCalls = false;
    }
      

  8.   

    public delegate void changeTextDelegate(string s);  public void changeText(string s)
      {
          textBox1.Text += s;
      }private void listen()
      {
        changeTextDelegate ct = new changeTextDelegate(changeText);
        byte[] recv = new byte[1024];
        System.Net.Sockets.Socket handle;
        handle = serverSocket.Accept();
        while (true)
         {
           if (handle.Connected)
           {
            //ct.BeginInvoke("已经连接上一个客户端发来的连接55555555!", null, null);
            ct("连接上一个客户端发来的连接55555555!");
            handle.Receive(recv);
            //ct(BitConverter.ToString(recv, 0));
            }
         }
      }为什么我用了委托还是不行呀???  大家看看我有用错吗?
      

  9.   

    我是按照 feiyun0112(http://feiyun0112.cnblogs.com/) 来做的呀?
      

  10.   

    用委托
    加入事件方式更好,当有数据就自动触发.
    public delegate void OnChangedEvent(string message);
    public event OnChangedEvent ChangedEvent;
    private void OnChangedText(string message)
            {
                if (this.textBox1.InvokeRequired)
                {
                    OnChangedEvent handle = new OnChangedEvent(this.OnChangedText);
                    this.Invoke(handle, new object[] { message });
                }
                else
                {
                    this.textBox1.Text+=message + "\n";
                }
            }
      

  11.   

    我怎么没看见textBox1的定义啊,是不是这问题呢,要不是的话,可以考虑把textbox1设成public或用get,set等改变值