在使用使用BackGroundWorker等待句柄的方法时,我使用了一个BackGroundWorker来避免UI冻结,该方法用于在UI中的面板上绘制,并且在UI中有面板失效。
something()
{
draw()
panel.invalidate()
A.waitone(500)
}问题是,有时工人被卡在绘图的中间,当我按下“工人开始”按钮时,它又工作了,也没有被卡住,这意味着它不是因为忙而卡住了,所以画不上工人,但是每次抽签后我都失效了,那么有什么想法吗?
发布于 2010-06-28 07:50:38
如果希望后台进程更新UI,则需要使用控件的“调用”方法(这将确保代码在UI线程中运行,而不是在后台线程中运行):
something()
{
panel.Invoke(new Action( () => {this.draw(); panel.Invalidate();} );
A.waitone(500)
}或者,没有兰博达
something()
{
panel.Invoke((MethodInvoker)delegate{ this.draw(); panel.Invalidate();});
A.waitone(500)
}编辑:在看到其他答案上的新注释之后--您可以在线程处理期间将每个控件调用包装在一个' invoke‘调用中,因此,与其在调用中调用’during ()‘方法本身,不如让during()方法在需要更新UI时使用Invoke。
发布于 2010-06-28 07:31:53
您不应该从背景工作者调用的方法中访问UI元素。
(摘自评论)
,我正试着一步一步地画一些东西,这就是为什么我需要腰部
如果您希望一步一步地绘制,在每一步之间延迟,那么我倾向于使用System.Windows.Forms.Timer,而不是等待等待。将计时器设置为按你想要的频率触发,当它触发时,你要画的任何东西都要多画一点。
https://stackoverflow.com/questions/3130692
复制相似问题