vs 2005 启用线程,因为要对窗体进行交互,所以用了委托,不用的话会报错说控件不是由主线程初始化的等等。。
 private void button1_Click(object sender, EventArgs e)
        {
            Thread cha = new Thread(new ThreadStart(threadchange));
            cha.Start();
        }private void threadchange()   
        {
            MethodInvoker In = new MethodInvoker(change);
            this.BeginInvoke(In);
        }private void change()
        {
            this.label1.Text = "已发生变化";
        }-----------------------------------------------------------以上方法可以正常通过, 但是如果使用下面这个带参数调用的话就不行了private void change(string str)
        {
            this.label1.Text = str;
        }因为MethodInvoker In = new MethodInvoker(change);这个委托change不能带参数,我是初学者,请教怎么才可以调用带参数的???

解决方案 »

  1.   

    給你個例子看看﹐希望對你有用:
    class TT
    {
    public string pMsg;
    public void Msg(string msg)
    {
    MessageBox.Show(msg); 
    }
    public void Msg()
    {
    MessageBox.Show(pMsg); 
    }
    }private void button1_Click(object sender, System.EventArgs e)
    {
    TT sT=new TT(); 
    sT.pMsg = "AA";
    System.Threading.Thread thd=new System.Threading.Thread(new System.Threading.ThreadStart(sT.Msg));
    thd.Start(); 
    }
      

  2.   

    private void threadchange()   
            {
                MethodInvoker In = new MethodInvoker(change);
                this.BeginInvoke(In,new object[] {"已发生变化"}););
            }private void change(string str)
            {
                this.label1.Text = str;
            }
      

  3.   

    private void threadchange()   
            {
                MethodInvoker In = new MethodInvoker(change);
                this.BeginInvoke(In,new object[] {"已发生变化"});
            }private void change(string str)
            {
                this.label1.Text = str;
            }
      

  4.   

    谢谢,热心的兄弟们,呵呵, 我以前不是搞这个编程的,刚研究2天,还不太明白,只会看懂例子,我先去试下, 如果成功了就过来揭帖,如果有更好的例子,希望也能发给我撒,  [email protected] 还有个疑问就是 sqfeiyu(流星雨)  你是new了一个类,传递参数 string 等是可以的,如果我需要给他传个窗体 form1 呢? 因为这个class TT 可能会用到 form1.textbox.text 哦,我不是很明白,刚搞。
      

  5.   

    用反射啊﹗傳遞form1的類名稱(帶命名空間的),然后用form1 frm=(form1)System.Activator.CreateInstance(Type.GetType("form1的類名"));
    然后就可以用form1的方法了。
      

  6.   

    ======================
    可能会用到 form1.textbox.text 
    ======================
    你的form1的textbox如果是動態設定的text最好不要用這種方法﹐先在程序中想辦法取出text,然后再傳值。當然你也可以直接傳一個form,例﹕
    class TT
    {
        public 你的程序名.form1 pfrm;
        public TT(Form frm)
        {
            pfrm=(你的程序名.form1)frm;
        }
        public void Msg()
    {
    MessageBox.Show(pfrm.TextBox1.text); 
    }}
      

  7.   

    谢谢  njp20033266njp() sqfeiyu(流星雨) winer2006(我心飞扬) 呵呵,不过问题还是没有解决哦, 虽然说加分是个很俗的举动,不过我还是会给你们加分的,呵呵,我给的分与你们的热情相比,太少了。  sqfeiyu(流星雨) 你的方法不错,都可以用,不过 你那个 class tt的例子,没有用委托,在vs03中可以通过 vs05就不行了,必须用委托才能运行多线程,象下面这样子才可以---------------------------
    private void button1_Click(object sender, EventArgs e)
            {
                Thread cha = new Thread(new ThreadStart(threadchange));
                cha.Start();
            }private void threadchange()   
            {
                MethodInvoker In = new MethodInvoker(change);
                this.BeginInvoke(In);
            }private void change()
            {
                this.label1.Text = "已发生变化";
            }
    -------------------------------------- 可是这个调用的方法都是 不带参数的,带了参数就不行了,我还没搞定winer2006(我心飞扬) 改写的方法this.BeginInvoke(In,new object[] {"已发生变化"}); 也不行,运行不了, 说什么重载与委托冲突还是什么的。
      

  8.   

    public delegate void myEventHandle(string str);
    private void threadchange()   
            {
                myEventHandle In = new myEventHandle(change);
                this.BeginInvoke(In);
            }private void change(string sTmp)
            {
                this.label1.Text = sTmp;
            }
      

  9.   

    錯了一句﹕
    myEventHandle In = new myEventHandle(change,new object[] {"已发生变化"});
      

  10.   

    暈﹐又打錯了﹕
    myEventHandle In = new myEventHandle(new myEventHandle(change),new object[] {"已发生变化"});
      

  11.   

    sqfeiyu(流星雨)的方法是对的,我赞同。
      

  12.   

    今天丑大了~~
    Invoke(new myEventHandle(change),new string[]{"狂暈﹐又錯了"});
      

  13.   

    sqfeiyu(流星雨)这样写是对的
    public delegate void myEventHandle(string str);
    private void threadchange()   
    {
    Invoke(new myEventHandle(change),new string[]{"555﹐111"});
    } private void change(string sTmp)
    {
    this.label1.Text = sTmp;
    }