线程间操作无效: 从不是创建控件“”的线程访问它 怎么办啊???

ridge.chang 2009-12-13 11:40:35
各位大虾好:

线程间操作无效: 从不是创建控件“”的线程访问它 怎么办啊???
下面是我的相关部分代码:

Label lblA,lblB;
void moveAB()
{
Label swap,destPie;
destPie = lblB;
swap lblA;

Thread moveThread = new Thread(delegate() {
movePie(swap, destPie,'A','B'); });

moveThread.Start();
moveThread.Join();
}
//------------------------------------------------------------------
private void movePie(Label move, Label destPie, char start, char dest)
{
while(true)
{
move.Top += 5;
move.Left += 5;
Thread.Sleep(100);
}
}
...全文
126 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
bingo_ 2009-12-14
  • 打赏
  • 举报
回复
private void movePie(Label move, Label destPie, char start, char dest)
{
while(true)
{
setTop(move,5);
Thread.Sleep(100);
}
}

delegate void setDelegate(Label move ,int pra);
void setTop(Label move,int pra)
{
if ( this.InvokeRequired )
this.Invoke( new setDelegate(setTop) , new Object[]{ move , par } );
else
move.Top += pra;
}
starj1 2009-12-14
  • 打赏
  • 举报
回复
通过委托再把对控件修改的动作传回去给创建控件的线程,让创建控件的线程修改。
freeboy827 2009-12-14
  • 打赏
  • 举报
回复

this.invoke(new eventhanlder(delegate{
//写在这里
}));
ProjectDD 2009-12-14
  • 打赏
  • 举报
回复
到MSDN去学习一下

System.Windows.Forms.Control.Invoke(Delegate d); 这个方法
Jave.Lin 2009-12-14
  • 打赏
  • 举报
回复
他面的都是挺好的办方法。

还有一种次法:

把该代码写在构造函数里:

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
walkghost 2009-12-14
  • 打赏
  • 举报
回复
写个委托!
ridge.chang 2009-12-14
  • 打赏
  • 举报
回复
2楼您好:
我用你的代码试了一下,可以,
但是在下面这一句中
this.Invoke( new setDelegate(setTop) , new Object[]{ move , par } );
出现了这个异常:
System.ObjectDisposedException
无法访问以释放的对象。

怎么解决啊???
谢谢

111,120

社区成员

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

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

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