关于控件异步调用的问题,请大家指点一二,在线等。

wangdongfeng 2006-09-15 10:20:03
我创建了一个类用于更新UI线程中pictrueBox。

类中建立了一个私有成员private System.Windows.Forms.PictureBox pb;
有如下方法:
public void GetLCD()
{
MethodInvoker InitLCDInvoker = new MethodInvoker(InitLCD);

pb.BeginInvoke(InitLCDInvoker);

}

public void InitLCD()
{
pb.Width = btMsgPacket[11];
pb.Height = btMsgPacket[13];
pb.BackColor = System.Drawing.Color.Black;
pb.Visible = true;

}

在一个非UI线程中使用该类,并把UI线程创建的pictrueBox对象的引用传递给这个类的构造函数。

然后调用该类的GetLCD()方法,但是运行到pb.Visible = true;会报错。

错误:不是从创建该控件的线程调用

但是注释掉该句,前面的确可以正常运行

想了半天也不明白,为什么同样是对控件进行操作,有的可以而有的就不行。
比如这三句就可以正常运行:
pb.Width = btMsgPacket[11];
pb.Height = btMsgPacket[13];
pb.BackColor = System.Drawing.Color.Black;
...全文
92 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
commandown 2006-09-15
  • 打赏
  • 举报
回复
你的前三项只是对pb的属性进行了改变,并没有触发当前control [this] 的任何方法,所以操作是通过的,而你的Visible 属性的改变,触发了this的onpaint,所以会提示出错

通过以下,我从this.invoke ,应该就会通过啦


换一下,ms推荐的UI线程更新方法
申明
delegate void delegateInitLcd();

if (pb.InvokeRequired)
{
delegateInitLcd d = new delegateInitLcd();
this.Invoke(d, null);
}
else
{
pb.Width = btMsgPacket[11];
pb.Height = btMsgPacket[13];
pb.BackColor = System.Drawing.Color.Black;
pb.Visible = true;
}


===============================
欢迎交流
http://cache.monocn.com
wangdongfeng 2006-09-15
  • 打赏
  • 举报
回复
愚翁在不?
除了你,好像没有人知道了。
wangdongfeng 2006-09-15
  • 打赏
  • 举报
回复
没有人知道么?
wangdongfeng 2006-09-15
  • 打赏
  • 举报
回复
OK,解决了。
谢谢啦~
wangdongfeng 2006-09-15
  • 打赏
  • 举报
回复
楼上的,我这是在一个类中声明的方法。
哪里来的this啊,这里面的this是指类的本身啊。

110,534

社区成员

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

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

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