我用一个独立的线程处理socket的连接、接受与发送,但是这个线程不能修改窗口的控件,因为控件是主线程建立的,怎么解决?谢谢

解决方案 »

  1.   

    大致思路是这样的,通过创建一个线程类去处理socket的连接、接受与发送.
      

  2.   

    所有要修改UI元素的行为都另外写方法,然后定义同签名的委托,然后使用 Control.Invoke() 方法来确保在UI线程修改UI元素例如添加一条信息public void AppendMessage(string message) {
      this.txtMessage.Text += "\r\n" + message;
      this.txtMessage.Select(this.txtMessage.Text.Length, 0);
      this.txtMessage.ScrollToCaret();
    }然后定义委托:public delegate void AppendMessageDelegate(string message);然后在线程中调用的时候:mainForm.Invoke(new AppendMessageDelegate(mainForm.AppendMessage),
      new object[] { "netmicro说: 这不就行了么" });-------一个更好的方法就是将Invoke也封装到UI里面,即public void AppendMessage(string message) {
      if (this.InvokeRequired) // 当前线程不是UI线程就会返回true
        this.Invoke(new AppendMessageDelegate(AppendMessage),
          new object[] { message });
      else {
        this.txtMessage.Text += "\r\n" + message;
        this.txtMessage.Select(this.txtMessage.Text.Length, 0);
        this.txtMessage.ScrollToCaret();
      }
    }这样,线程里就可以直接写
    mainForm.AppendMessage("netmicro说: 这不就行了么");
      

  3.   

    可是还有一个问题,我在其他线程怎么得到窗口的实例名字?现在我按照netmicro的方法做了,这些都不是静态方法,C#里的窗口实例的名字是什么……?
      

  4.   

    公司上班不能用QQ和MSN,实在是无聊,就自己做了一个局域网的聊天工具。
    有兴趣的朋友可以试试看。不需要建立服务器!!!名称:EasyMessenger
    版本:2006 第2版主要功能介绍:
     点对点私聊
     多人群聊
     自定义表情
     发送网络图片
     即时传送文件
     历史记录保存有需要的朋友可以来信,可以自己定义需要的群组。下载页面:
    http://www.easymessenger.cn