是否可以从backgroundworker dowork事件更新UI

时间:2010-09-22 20:29:50

标签: vb.net backgroundworker

我见过有类似问题的其他人,但不是我想要的。在backgrounderworker类dowork事件中,我创建了一个新类的实例并调用其中一个函数。以前,我在windows.form.timer tick事件中有这个代码,并且会传递一个委托作为参数之一,它允许函数和它在类中调用的其他函数调用表单上的方法来更新数据网格在GUI上。有没有办法在dowork活动中做到这一点?我需要这个,因为我从dowork调用的函数调用其他函数,我希望每个函数都在GUI数据网格中记录信息。

3 个答案:

答案 0 :(得分:5)

BackgroundWorker.ReportProgress()方法旨在实现这一目的。您实现ProgressChanged事件以更新UI,它将在主线程上运行。您不仅限于报告进度百分比,还可以通过使用接受 userState 参数的重载来传递任何对象以将信息传递给事件处理程序。请注意,如果你这样做,你必须使用正确的锁定。

答案 1 :(得分:0)

除了汉斯回答中提到的ReportProgess之外,您还可以在其中一个UI元素上使用Control.Invoke来在UI线程中执行代码。

答案 2 :(得分:0)

您可以将进度数据发送回UI线程,您将在UI线程上获得该事件,然后您可以更新屏幕。您发送回UI线程的对象是高度首选是不可变的。除了调用ReportProgress并处理事件之外,您还需要通过将WorkerSupportsProgress属性设置为true来选择加入。