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