在使用等待句柄的方法时,我正在使用BackGroundWorker来避免UI冻结,此方法用于在UI中的面板上绘制并且内部有面板无效。
something()
{
draw()
panel.invalidate()
A.waitone(500)
}
问题是,有时候工人卡在图纸中间,当我按下工人开始按钮时,它再次工作并且不会卡住,这意味着它没有因为忙碌而卡住,所以被困的绘图不是工人,但是每次抽奖后我都会失效,所以任何想法都会发生?
答案 0 :(得分:1)
您不应该从后台工作者调用的方法中访问UI元素。
(来自评论)
我正在尝试逐步绘制一些东西,这就是我需要等待句柄的原因
如果你想逐步绘制,在每一步之间延迟,那么我倾向于使用System.Windows.Forms.Timer而不是等待等待句柄。将计时器设置为以您想要的频率触发,并且当它触发时,绘制更多的正在绘制的内容。
答案 1 :(得分:1)
如果您希望后台进程更新UI,则需要使用控件的“Invoke”方法(这将确保代码在UI线程中运行,而不是在后台线程中运行):
something()
{
panel.Invoke(new Action( () => {this.draw(); panel.Invalidate();} );
A.waitone(500)
}
或者,没有Lambda
something()
{
panel.Invoke((MethodInvoker)delegate{ this.draw(); panel.Invalidate();});
A.waitone(500)
}
编辑:在看到其他答案的新评论后 - 你可以在线程处理期间将每个控制调用包装在'Invoke'调用中,所以不要在调用中调用'draw()'方法本身,只要需要更新UI,draw()方法就会使用Invoke。