C#线程2个小问题,求教

charbes0801tom 2012-05-29 10:51:06
第一个问题,我想用线程为我的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#,很多东西都不太懂,有没人高手帮帮忙,在此多谢了。
...全文
181 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
__天涯寻梦 2012-05-30
  • 打赏
  • 举报
回复
private void setLabelText()
{
this.Invoke((MethodInvoker)(() => this.setText()));
}

lock (this) 去掉,没用
charbes0801tom 2012-05-30
  • 打赏
  • 举报
回复
貌似还是不行啊,7楼的方法我试了,但是只执行一次,下次就不执行了,8楼的方法依然会出那个异常,还有没有别的方法啊。。
裸奔的蜗牛 2012-05-30
  • 打赏
  • 举报
回复
少了个else
裸奔的蜗牛 2012-05-30
  • 打赏
  • 举报
回复

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;
}
charbes0801tom 2012-05-29
  • 打赏
  • 举报
回复
饿,2楼的朋友说的我不太懂,非主线程是什么,3楼朋友的第二个网址和我做的差不多,他是一个计算+进度条,我是初始化界面+进度条,但是我把程序打包安装后,执行的时候那个界面不会初始化了,但是用VS运行就很好用,很奇怪啊。
vinjent 2012-05-29
  • 打赏
  • 举报
回复
http://www.dotblogs.com.tw/yc421206/archive/2009/02/13/7141.aspx
http://www.dotblogs.com.tw/atowngit/archive/2010/01/05/12810.aspx
_贺兰 2012-05-29
  • 打赏
  • 举报
回复
第一个问题:
this.invoke()方法应该是在非主 线程的执行函数里面调用吧(在UI线程里调用没实际意义),那就是说你的setLabelText()应该是 线程的执行函数,但是你在里面又直接调用setText()控制UI线程的控件,岂能不错?
解决办法是:将委托InvokeLabelText()的对象设为setText()后,在 你的非主线程执行函数里面 INVOKE这个委托就行了
charbes0801tom 2012-05-29
  • 打赏
  • 举报
回复
不好意思代码弄错啦,重贴

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我定义的一个变量,值总会改变
}
}
  • 打赏
  • 举报
回复
http://blog.csdn.net/xianfajushi/article/details/7609849
sd1232123 2012-05-29
  • 打赏
  • 举报
回复
你的lock不能这么搞把。。哪个对象会变动就锁哪个,这里就应该是lock(this。lblMsg)
vinjent 2012-05-29
  • 打赏
  • 举报
回复
運行與DEBUG本來就不一樣﹗
setText()跟setLabelText()不在同一線程﹗
如果你真的這樣測試,setText()再用delegate作一次委派吧﹗

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧