BackGroundWorker的问题

时间:2010-06-28 07:27:16

标签: c# winforms backgroundworker

在使用等待句柄的方法时,我正在使用BackGroundWorker来避免UI冻结,此方法用于在UI中的面板上绘制并且内部有面板无效

something()
{
  draw()
  panel.invalidate()
  A.waitone(500)

}

问题是,有时候工人卡在图纸中间,当我按下工人开始按钮时,它再次工作并且不会卡住,这意味着它没有因为忙碌而卡住,所以被困的绘图不是工人,但是每次抽奖后我都会失效,所以任何想法都会发生?

2 个答案:

答案 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。