class A有个方法private funB()及线程函数funC();
funB()开启一个线程,线程执行线程函数new ThreadStart(funC);
funC()中要修改窗体FRM中的一个控件的值.如何实现呢??

解决方案 »

  1.   

    //定义一个委托
    public delegate void MyInvoke(string str);
    //更新界面的函数
    private void updateUI(string str)
    {
        //比如设置Label的值
      this.Label1.text=str;
    }//线程回调函数
    private void funC()
    {
         string str="youValue";
         //更新界面
         MyInvoke mi=new MyInvoke(updateUI);
         this.BeginInvoke(mi,new object[]{str});
    }
      

  2.   

    //线程回调函数
    private void funC()
    {
         string str="youValue";
         //更新界面
         MyInvoke mi=new MyInvoke(updateUI);     //你这个this指的是啥东西?funC()不在窗体FRM类里定义的呀.FunC()是类A的一个线程函数.你这this.后面出不了BeginInvoke()吧...类A是自定义类....
         this.BeginInvoke(mi,new object[]{str});
    }
      

  3.   

    this是指当前窗体,不好意思,我以为你的线程是在Form里的...你是想实现什么?窗体类中新建一个A的对象,然后再通过A来更新窗体?
      

  4.   

    是的,本意就是为了通过A来更新窗体...不过感觉起来又怪怪的...如果我的线程函数不定义在类A里而是定义在窗体类里就好办了吧?但是线程一定是在A里开启的..那如何把窗体类中的线程函数传过来给类A呢??也就是说FRM:ThreadFun() 如果出现在A:new Thread(new ThreadStart(这里))中....
      

  5.   

    代码大概是这样的;
    Form:OnFormLoad()
    {
        //窗体控件timer
        timer.start();
        //类A实例调用
        AInstance.publicFun();
    }//类A的publicFun()
    A:publicFun()
    {
        //开启线程.
        threadA = new Thread(new Threadstart(threadFun));
    }//在类A中的线程函数
    A:threadFun()
    {
        //修改窗体的timer令其stop();就是这里不知道要如何去修改,或者我这样的编程本来就不对了.请高手指点...
        timer.stop();
    }
      

  6.   

    这其实像是一种传递函数指针的意思呀.只不过我学C#不久.对.NET的理解又太浅.有没有人指点下.如何传递函数的指针...
      

  7.   

    总之在UI线程之外的线程想要访问UI相关的资源,都必须通过Control.Invoke。
      

  8.   

    我是这样设计程序的,为了实现多线程通讯的自封装类.定义SockManage提供ConnectTo()公有方法,调用此方法启动一个线程并连接.但是此线程的连接信息必需回馈给界面.如SocketException的异常"由于连接方在一段时间后没有正确的答复或连接的主机没有反应,连接尝试失败。"且在连接期间保持动态更新界面进度条显示当前正在进行连接的状态.这将导致一个问题,当我把线程函数放在自定义类SockManage中实现时无法访问窗体控件,因为我不知道要如何去访问.因此我目前只能
      

  9.   

    在你的封装类中写个public 的event,比如match,当匹配到就即使通知界面更新
    private void OnMatch(string name)
            {
                lock(this)
                {
                    FireAsync(Match, name);
                }
            }protected void FireAsync(Delegate dlg, params object[] pList)
            {
                if (dlg != null)
                {
                    Target.BeginInvoke(dlg, pList);
                }
            }
      

  10.   

    这将导致一个问题,当我把线程函数放在自定义类SockManage中实现时无法访问窗体控件,因为我不知道要如何去访问.因此我目前只能将线程函数放于窗体类中,当实例化SockManage时,将窗体线程函数的指针传给SockManage的线程启动函数.这样虽然实现了动态更新界面和出错信息的反馈,但却体现不出封装的效果.代码大概如下://全局代理,即线程函数的代理.
    public delegage void ConnectHelper();
    //窗体加载时.
    Form:Load()
    {
        SockManage Comm = new SockManage();
        Comm.DoConnect += new ConnectHelper(ConnectCallBack);
        Comm.ConnectTo();
    }
    Form:ConnectCallback()
    {
        //在这里通过BeginInvoke()可修改界面控件.但是...又没了封闭的效果...
        try
        {
             //我已经Socket与EndPoint等定义在SockManage中,但现在又必需把他们用public暴露 出来,因为我的线程函数都成了窗体的成员函数了.
             Comm.Socket.Connect(Comm.IPEndPoint)
        }
    }
    SockManage:ConnectTo()
    {
        //其中DoConnect在类SockManage中定义为:public event ConnectHelper Doconnect;
        Thread t = new Thread(new ThreadStart(DoConnect));
    }//但如果是把ConnectCallback()定义于SockManage中如下:
    SockManage:ConnectCallback()
    {
        //在这里访问Socket,EndPoint就很好了.但又不能通过BeginInvoke去访问窗体控件,请问我应该如何去实现多线程的封装,又可动态更新窗体.如果有朋友有这方面的代码请发到我的EMAIL:
    [email protected]谢谢了...
    }
      

  11.   

    使用
    Control.Invoke或Control.BeginInvoke来更新UI上的控件。
    http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/misMultithreading.mspx
    http://www.microsoft.com/china/MSDN/library/architecture/AsynCallPattern.mspx