The only way a background worker can communicate back to the form, as far as I know, is through the ReportProgress method which triggers the ProgressChanged event. But depending upon what kind of updates you are trying to make on the screen...this might be enough. For example, if all you are trying to do is change a label so it will report to the user that the process is now on Step 2, you can just setup the ProgressChanged event to do it. Here's a sample of how I've used values 0-9 when reporting progress to update labels and the progressbar on my form...and then any value greater than 9 sets the progressbar value.
Private Sub bgwSync_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgwSync.ProgressChanged
Select Case e.ProgressPercentage
Case 0
barProgress.Value = 0
Case 1
lblMessage.Text = "Checking for program updates..."
barProgress.Value = 5
Case 2
lblMessage.Text = "Updating program..."
barProgress.Value = 15
Case 3
lblMessage.Text = "Processing Step One..."
Case 4
lblMessage.Text = "Processing Step Two..."
Case 5
lblMessage.Text = "Retrieving data..."
Case 6
lblMessage.Text = "Downloading files..."
barProgress.Value = 15
Case 7
lblMessage.Text = "Loading tables..."
Case 8
lblMessage.Text = "Processing Step Three..."
Case 9
lblMessage.Text = "Processing Step Four..."
Case Is >= 10
barProgress.Value = e.ProgressPercentage
End Select
End Sub
If you are trying to be more specific and want to report a string value like a filename or something and where it is being used in the process...you still might be able to use the idea above but you would have to get the filename or whatever the same way on the form as you do in the backgroundworker and use an integer value from 0 to 100 to reference it on both sides. So it's limiting, but might be possible.
Hope this helps.