关于WINFORM的代码结构的问题

jiezi316 2009-09-10 05:46:10
场景如下:
这窗体启动一个SOCKET线程,我为了代码清晰,将这个SOCKET线程运行的函数放到了另一个CS文件里面(其实我更想编译为一个单独的DLL)。疑问如下:
当SOCKET收到信息后,我需要设置窗体UI界面。

现在实现方法有2种:
1 将窗体的实例赋值为一个全局静态变量。这样在SOCKET里面就可以通过全局变量来Invoke()调用写在FORM里面的设置UI的函数了。

但我觉得这个应该是一个单独的逻辑文件,不应该和界面有联系。

2 SOCKET收到信息后,设置标志位,窗体里面通过TIMER轮询状态位来设置UI。

这样其实这个类也和具体的标志位有了联系。


不晓得有其他好的处理方法没有?
...全文
77 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
七子贝 2009-09-12
  • 打赏
  • 举报
回复
真厉害,哈,原来高手这么多......
dancingbit 2009-09-12
  • 打赏
  • 举报
回复
这样导致窗体类有很多事件触发函数。

----------------------------------

这是问题吗?
jiezi316 2009-09-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhoufoxcn 的回复:]
3、在这个单独的cs文件对应的类中加一个事件,满足某种条件时就会激发事件,然后在窗体类中监听刚才那个类的事件。这样仅仅当发生了事件时才会导致界面响应,否则无需处理。
[/Quote]
这种方式我也考虑过,觉得很好,但缺点就是,如果有很多要更新UI的地方,这样导致窗体类有很多事件触发函数。
fengjian_428 2009-09-10
  • 打赏
  • 举报
回复
我这段代码是直接放在主窗体的自定义控件内的,当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);
}
}
fengjian_428 2009-09-10
  • 打赏
  • 举报
回复
要用多线程和委托
红街咖啡 2009-09-10
  • 打赏
  • 举报
回复
看看。不说话。嘿嘿
wenbin 2009-09-10
  • 打赏
  • 举报
回复
使用事件,同时别忘了使用委托,将对UI的操作委托到UI线程中
周公 2009-09-10
  • 打赏
  • 举报
回复
个人感觉这种方式比你上面的两种方式都要好,甚至可以多个窗体对Socket的事件进行监听。
业务处理方面逻辑也很清晰。
周公 2009-09-10
  • 打赏
  • 举报
回复
3、在这个单独的cs文件对应的类中加一个事件,满足某种条件时就会激发事件,然后在窗体类中监听刚才那个类的事件。这样仅仅当发生了事件时才会导致界面响应,否则无需处理。

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧