有Label控件ID为State
点击按钮后运行
Thread t = new Thread(Run);
t.Start();//线程中通过代理修改了State的值。
State.Text="结束";//想要在线程运行结束后把Label修改成这个值。
可是每次运行完显示的都是线程里的最后一次赋值。请教一下大家!谢谢帮忙!

解决方案 »

  1.   

    看来你的State.Text="结束";语句应该是在你的Run方法里
    调试的时候会报错,在该控件以外的线程修改该控件的内容不是安全的需要稍修改一下
    public partial class Splash : Form
        {
            delegate void CloseCallBack();
            public Splash()
            {
                InitializeComponent();
             }  
            public void Exit()
            {            
                if (this.InvokeRequired)
                {
                    CloseCallBack cb = new CloseCallBack(Exit);
                    this.Invoke(cb);
                }
                else
                {
                    this.Close();
                }
            }这是我一个项目里的封面的部分代码,跟你的问题原理是一样的,你把你的标签控件从Label继承,加一个委托和方法就可以了,注意该委托及方法可以带0个或多个参数的,你可以把“结束”字符串做为参数
      

  2.   

    说明一下:
    上面的封面Form是在一个单独的线程中运行的,当主线程工作就绪后,调用其Exit关闭封面(同时Show出主界面),实际上就是从主线程访问另一个线程的Form(或其控件)
      

  3.   

    二个方法:
    1.定义一个委托,在Run线程里调用;
                //这几句是必需的
                this.SetText += new SetTextHandle(_SetText);        internal delegate void SetTextHandle(string ToSet);
            internal event SetTextHandle SetText;        void _SetText(string ToSet)
            {
                if (this.InvokeRequired)
                {
                    this.Invoke(new SetTextHandle(_SetText), new object[] { ToSet });
                }
                else
                {
                    State.Text = ToSet;
                }
            }            //在Run线程结束处调用SetText
                SetText("字符串");2.在Label State的定义前加volatile关键字,使它可以被别的线程访问。最后在Run线程的结束处直接对State赋值。
      

  4.   

    线程里对控件操作一涉及线程安全问题:取消该敏感检测就可以了:System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;用一个比较笨的方法可以处理:Thread t = new Thread(Run);
    t.Start();//不过C#对线程的状态判断不准
    while(t.ThreadState==ThreadState.Stopped)
    {
     Thread.Sleep(200);
    }
    State.Text="结束";
      

  5.   

    应该是 !=Thread t = new Thread(Run);
    t.Start();//不过C#对线程的状态判断不准
    while(t.ThreadState!=ThreadState.Stopped)
    {
     Thread.Sleep(200);
    }
    State.Text="结束";