我在子线程里用delegate改变窗体上label的显示值,但是就是不会变化。
定义:
public delegate void MyInvoke(string str);
private void SetConnectState(string info)
        {
            label1.Text  = info;
        }子线程里调用:
MyInvoke mi = new MyInvoke(SetConnectState);
this.Invoke(mi, new object[] {“abc”});我断点跟踪了一下SetConnectState这个方法确实被调用执行了 但是为什么label的显示值就是不会变化?

解决方案 »

  1.   

            private delegate void MyInvokeDelegate(string name);        private void DoSomething(object o)
            {
                this.Invoke(new MyInvokeDelegate(this.ChangeText), o.ToString());
            }        private void ChangeText(string name)
            {
                this.textBox2.Text = name;
            }        在子程序调用
             this.DoSomething(szData);
      

  2.   

            public delegate void MyInvoke(string str);
            private void SetConnectState(string info)
            {
                label1.Text = info;
            }        private void Do()
            {
                MyInvoke mi = new MyInvoke(SetConnectState);
                this.Invoke(mi, new object[] { "abc" });
            }        private void button1_Click(object sender, EventArgs e)
            {
                Thread th = new Thread(new ThreadStart(Do));
                th.Start();
            }上面的代码我试过了,应该可以实现你的要求,你可以试试看
      

  3.   

    跨线程安全性的限制,UI线程不会接受来自于其他线程的修改.通过delegate将修改动作移到UI线程上
      

  4.   

    通过Control.Invoke或Control.BeginInvoke应该没有什么问题。
    http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/misMultithreading.mspx
    http://www.microsoft.com/china/MSDN/library/architecture/AsynCallPattern.mspx