有Label控件ID为State
点击按钮后运行
Thread t = new Thread(Run);
t.Start();//线程中通过代理修改了State的值。
State.Text="结束";//想要在线程运行结束后把Label修改成这个值。
可是每次运行完显示的都是线程里的最后一次赋值。请教一下大家!谢谢帮忙!
点击按钮后运行
Thread t = new Thread(Run);
t.Start();//线程中通过代理修改了State的值。
State.Text="结束";//想要在线程运行结束后把Label修改成这个值。
可是每次运行完显示的都是线程里的最后一次赋值。请教一下大家!谢谢帮忙!
调试的时候会报错,在该控件以外的线程修改该控件的内容不是安全的需要稍修改一下
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个或多个参数的,你可以把“结束”字符串做为参数
上面的封面Form是在一个单独的线程中运行的,当主线程工作就绪后,调用其Exit关闭封面(同时Show出主界面),实际上就是从主线程访问另一个线程的Form(或其控件)
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赋值。
t.Start();//不过C#对线程的状态判断不准
while(t.ThreadState==ThreadState.Stopped)
{
Thread.Sleep(200);
}
State.Text="结束";
t.Start();//不过C#对线程的状态判断不准
while(t.ThreadState!=ThreadState.Stopped)
{
Thread.Sleep(200);
}
State.Text="结束";