当前位置: 代码迷 >> C# >> 类库文件中的线程怎么修改winform中label的text值-C
  详细解决方案

类库文件中的线程怎么修改winform中label的text值-C

热度:220   发布时间:2016-05-05 02:56:47.0
类库文件中的线程如何修改winform中label的text值-C#
问题描述:
    一个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等)。
  相关解决方案