第一个问题,我想用线程为我的LABEL的TEXT赋值(因为值总在变),即使我用了INVOKE但是依然会出CrossThreadMessagingExceoption,代码如下:private void delegate InvokeLabelText();
private void setLabelText()
{
    if (this.InvokeRequired)
    {
        InvokeLabelText invokeLabelText = new InvokeLabelText(aa);
        this.Invoke(invokeLabelText);
        return;
    }
    setText();
}
public void setText()
{
    lock (this)
    {
        this.lblMsg.Text = Util.MSG; //Util.MSG我定义的一个变量,值总会改变
    }
}程序运行会很正常,不会抛异常,但是我打断点到SETTEXT方法里,LABEL赋值的地方执行后会没有值,并且报那个异常(程序运行依然正常)。
第二个问题,大家都用过BackgoundWorker这个组件吧,为什么我把程序打包了以后这个控件运行就不正常了,会出空指针错误,难道这个控件打包需要别的注意什么吗?
初学C#,很多东西都不太懂,有没人高手帮帮忙,在此多谢了。

解决方案 »

  1.   

    不好意思代码弄错啦,重贴private void delegate InvokeLabelText();private void Form_Load(object sender, EventArgs e)
    {
        Thread thread = new Thread(setLabelText);
        thread.Start();
    }private void setLabelText()
    {
        if (this.InvokeRequired)
        {
            InvokeLabelText invokeLabelText = new InvokeLabelText(setLabelText);
            this.Invoke(invokeLabelText);
            return;
        }
        setText();
    }public void setText()
    {
        lock (this)
        {
            this.lblMsg.Text = Util.MSG; //Util.MSG我定义的一个变量,值总会改变
        }
    }
      

  2.   

    第一个问题:
    this.invoke()方法应该是在非主 线程的执行函数里面调用吧(在UI线程里调用没实际意义),那就是说你的setLabelText()应该是 线程的执行函数,但是你在里面又直接调用setText()控制UI线程的控件,岂能不错?
    解决办法是:将委托InvokeLabelText()的对象设为setText()后,在 你的非主线程执行函数里面 INVOKE这个委托就行了
      

  3.   

    http://www.dotblogs.com.tw/yc421206/archive/2009/02/13/7141.aspx
    http://www.dotblogs.com.tw/atowngit/archive/2010/01/05/12810.aspx
      

  4.   

    運行與DEBUG本來就不一樣﹗
    setText()跟setLabelText()不在同一線程﹗
    如果你真的這樣測試,setText()再用delegate作一次委派吧﹗
      

  5.   

    你的lock不能这么搞把。。哪个对象会变动就锁哪个,这里就应该是lock(this。lblMsg)
      

  6.   

    http://blog.csdn.net/xianfajushi/article/details/7609849
      

  7.   


    private void delegate InvokeLabelText(string value);private void Form_Load(object sender, EventArgs e)
    {
        Thread thread = new Thread(setLabelText);
        thread.Start();
    }private void setLabelText(string value)
    {
        if (this.InvokeRequired)
        {
            InvokeLabelText invokeLabelText = new InvokeLabelText(setLabelText);
            this.Invoke(invokeLabelText,value);
        }
        this.lblMsg.Text  =  value;
    }
      

  8.   

    private void setLabelText()
    {
        this.Invoke((MethodInvoker)(() => this.setText()));
    }lock (this) 去掉,没用