场景如下:
这窗体启动一个SOCKET线程,我为了代码清晰,将这个SOCKET线程运行的函数放到了另一个CS文件里面(其实我更想编译为一个单独的DLL)。疑问如下:
当SOCKET收到信息后,我需要设置窗体UI界面。现在实现方法有2种:
1 将窗体的实例赋值为一个全局静态变量。这样在SOCKET里面就可以通过全局变量来Invoke()调用写在FORM里面的设置UI的函数了。但我觉得这个应该是一个单独的逻辑文件,不应该和界面有联系。2 SOCKET收到信息后,设置标志位,窗体里面通过TIMER轮询状态位来设置UI。这样其实这个类也和具体的标志位有了联系。
不晓得有其他好的处理方法没有?

解决方案 »

  1.   

    个人感觉这种方式比你上面的两种方式都要好,甚至可以多个窗体对Socket的事件进行监听。
    业务处理方面逻辑也很清晰。
      

  2.   

    使用事件,同时别忘了使用委托,将对UI的操作委托到UI线程中
      

  3.   

    我这段代码是直接放在主窗体的自定义控件内的,当Socket收到消息就在线程中更新界面上的listview的内容delegate void AddList(string s);
    private void MessageRecevier_Load(object sender, EventArgs e)
            {            Thread thread1 = new Thread(new ThreadStart(Recevice));
                thread1.IsBackground = true;
                thread1.Start();
            }
     void Recevice()
            {
                string hostname = System.Net.Dns.GetHostName();
                System.Net.IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(hostname);
                string ip = ipEntry.AddressList[0].ToString();            IPEndPoint localEP = new IPEndPoint(IPAddress.Parse(ip), 9060);
                ArrayList list = new ArrayList(10);
                server = new Socket(AddressFamily.InterNetwork,
                    SocketType.Dgram, ProtocolType.Udp);            server.Bind(localEP);
                EndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);            int recv;
                byte[] data;            while (true)
                {
                    data = new byte[1024];
                    recv = 0;
                    recv = server.ReceiveFrom(data, ref remoteEP);                String message = Encoding.Default.GetString(data, 0, recv);
                    String Data = Encoding.Default.GetString(data);                ChangeUI(Data);
                }
            }
            void ChangeUI(string s)
            {
              if (lvMessage.InvokeRequired)
                {
                    Invoke(new AddList(ChangeUI), s);
                }
                else
                {
                  //改变ListView lvMessage
                   lvMessage.Items.Insert(0, lvi);
                }
            }