Your problem is that you get a cross-thread exception when you try to pass Worker thread data to your ui thread. what you need to do is check InvokeRequired and begininvoke before setting up controls on your ui so that you don't get this error:
Private Sub work_CrossThreadEvent(ByVal sender As Object, ByVal e As System.EventArgs) Handles work.CrossThreadEvent If Me.InvokeRequired Then Me.BeginInvoke(New EventHandler(AddressOf work_CrossThreadEvent), New Object() {sender, e}) Return End If Me.Text = "Cross Thread" End Sub
just change the New EventHandler part to the event handler you are using.
I also think that using a background worker is not a bad method for your working classes, just create a class for your work and use the background worker to make the material for streaming a little as follows:
Public MustInherit Class Worker Protected WithEvents worker As BackgroundWorker Public Sub New() worker = New BackgroundWorker() worker.WorkerReportsProgress = True worker.WorkerSupportsCancellation = True End Sub Public Sub Start() If (Not worker.IsBusy AndAlso Not worker.CancellationPending) Then worker.RunWorkerAsync() End If End Sub Public Sub Cancel() If (worker.IsBusy AndAlso Not worker.CancellationPending) Then worker.CancelAsync() End If End Sub Protected MustOverride Sub Work() Private Sub OnDoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles worker.DoWork Work() End Sub Public Event WorkCompelted As RunWorkerCompletedEventHandler Private Sub OnRunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs) Handles worker.RunWorkerCompleted OnRunWorkerCompleted(e) End Sub Protected Overridable Sub OnRunWorkerCompleted(ByVal e As RunWorkerCompletedEventArgs) RaiseEvent WorkCompelted(Me, e) End Sub Public Event ProgressChanged As ProgressChangedEventHandler Private Sub OnProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs) Handles worker.ProgressChanged OnProgressChanged(e) End Sub Protected Overridable Sub OnProgressChanged(ByVal e As ProgressChangedEventArgs) RaiseEvent ProgressChanged(Me, e) End Sub End Class Public Class ActualWork Inherits Worker Public Event CrossThreadEvent As EventHandler Protected Overrides Sub Work() 'do work here' WorkABit() worker.ReportProgress(25) WorkABit() worker.ReportProgress(50) WorkABit() worker.ReportProgress(75) WorkABit() worker.ReportProgress(100) End Sub Private Sub WorkABit() If worker.CancellationPending Then Return Thread.Sleep(1000) RaiseEvent CrossThreadEvent(Me, EventArgs.Empty) End Sub End Class
disclaimer .. the bit is rusty with vb, but you should get this idea.
source share