none
关于跨线程问题 RRS feed

  • 问题

  • public partial class Form1 : Form
        {
          
            public Form1()
            {
                InitializeComponent();
              
            }

            delegate void settxt(object [] p);
          
            private void button1_Click(object sender, EventArgs e)
            {
                Thread th = new Thread(new ThreadStart(setTxtbox));
                th.Start();
            }
            private void setTxtbox()
            {
                this.Invoke(new settxt(delegate( object [] p) {
                    a p0 = p[0] as a;
                    a p1 = p[1] as a;

                    textBox1.Text = p0.str + p1.str;

                }) ,new object[] { new a("hellow"),new a("word")}

               );
            }
        }
        class a
        {
            public string str;
            public a(string str)
            {
                this.str = str;
            }
        }

    //出了什么问题呢,老说参数个数匹配不一致

    2014年4月27日 3:28

全部回复

  • Invoke方法的第二个参数是params object[] args,所以,你传入new object[] { new a("hellow"),new a("word")时编译器认为是你传入了两个参数,第一个是new a("hellow"),第二个是new a("word"),而delegte里面只要一个参数object [] p,这样就造成了参数个数不对。修改方式如下(这种情况编译器不会认为是两个参数):

               object o = new object[] { new a("hellow"), new a("word") };
                this.Invoke(new settxt(delegate(object[] p)
                {
                    a p0 = p[0] as a;
                    a p1 = p[1] as a;
    
                    textBox1.Text = p0.str + p1.str;
    
                }), o);

    或者直接用两个参数的形式:

    delegate void settxt(a p0, a p1);
    
    this.Invoke(new settxt(delegate(a p0, a p1)
                {
                    textBox1.Text = p0.str + p1.str;
    
                }), new a("hellow"), new a("word"));

    2014年4月27日 4:01
  • 是不是对Invoke传的参数个数,是根据我定义的delegate来传的?
    2014年4月27日 4:15
  • 是不是对Invoke传的参数个数,是根据我定义的delegate来传的?

    Invoke方法重载,最后一个需要object数组。该数组的每一个元素应该就是你自定义委托的参数,所以:

     this.Invoke(new settxt(delegate( object [] p) {
                    a p0 = p[0] as a;
                    a p1 = p[1] as a;
                    textBox1.Text = p0.str + p1.str;
                }) ,new object[] { new object[]{new a("hellow"),new a("word")}}
               );

    ASP.NET Forum
    Other Discussion Forums
    FreeRice Donate
    Issues to report
    Free Tech Books Search and Download

    2014年5月14日 6:01
    版主