问题描述:
一个winform窗体类,一个自己创建的类库文件HandleClientClass。winform中实例化一个HandleClientClass类(tcp监听)对象,这个对象启动tcp接收(这里边是多线程的,支持多个客户端连接),然后tcp接收到数据之后要修改winform中的label的值为接收到的数据。总之就是HandleClientClass里边的线程顺序执行到一行之后去修改winform中label的值。
求助各位大神如何实现,自己查看了一些资料,有说传递窗体,有说用委托的。我想请教一下如何用委托的方法来实现,谢谢!
------解决思路----------------------
http://www.cnblogs.com/adforce/archive/2011/12/16/2290157.html
------解决思路----------------------
因为窗体只有一个,线程可以无数,为了保护窗体正常使用,只能允许一个特别的线程来访问控件,下面的代码符合这个要求:
public void SetLabel(string str)
{
if (InvokeRequired)
{
Invoke(new Action<string>(SetLabel), str);
}
else
{
label1.Text = str;
}
}
------解决思路----------------------
不要去操作窗体,而是抛出一个事件,让窗体自己去处理。
------解决思路----------------------
如果你再工作个一两年,你就会理解“类库文件中的线程不应该修改winform”
“类库修改winform”带来了几个不好的后果:
一、类库依赖于Winform。
二、类库不支持其他UI,比如(WPF,Console,甚至WebPage等)。
简单的说,类库应该提供服务,而不应关心谁是服务的使用方。
因此你的问题可以这样解决:
1、类库提供一个事件(比如‘收到数据’事件)。
2、Winform作为服务的使用者,订阅事件。
3、当事件被触发时,Winform根据事件数据修改label(如果需要,这里可以用Control.Invoke等)。