在BackgroundWorker类的“完成”功能中,如何与表单进行交互?

时间:2013-12-11 18:09:51

标签: vb.net forms backgroundworker

我有一个BackgroundWorker,用于在显示表单时进行耗时的过程。表单和BackgroundWorker位于不同的类中,当BackgroundWorker完成它必须执行的操作时,我需要在表单上执行一些基本操作。

但是,以下内容不起作用并产生警告Reference to non-shared member requires an object reference

Private Sub bw_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)

    mainForm.btnCancel.Enabled = False
    mainForm.btnFinish.Enabled = True

End Sub

我研究了这个警告,它建议我必须确保声明了对象mainForm,这对于这个场景来说似乎很奇怪。无论如何,我将我的代码更改为此,警告消失了,但是如果怀疑,它不起作用。似乎会引用表单的新实例,这不是我需要的。

Private Sub bw_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)

    Dim objForm As New mainForm
    objForm.btnCancel.Enabled = False
    objForm.btnFinish.Enabled = True

End Sub

有人可以告诉我如何与BackgroundWorker中的表单进行交互吗?感谢。

1 个答案:

答案 0 :(得分:1)

问题不在于您需要声明新的 mainForm对象。问题是您需要引用正确的 mainForm对象。由于可以创建任意数量的mainForm对象,因此需要引用要修改的特定mainForm对象。请记住,mainForm是类(一种对象)。它本身并不是一个对象。

解决这个问题的最简单方法是向正在执行工作的类提供mainForm对象的引用,如下所示:

Public Class MyBusiness
    Public Property TheMainForm As mainForm

    ' ...

    Private Sub bw_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
        TheMainForm.btnCancel.Enabled = False
        TheMainForm.btnFinish.Enabled = True
    End Sub
End Class

然后,在开始工作之前,您需要确保设置TheMainForm属性。例如,像这样:

Dim business As New MyBusiness
business.TheMainForm = Me
business.DoWork()