Visual Basic .NET Language
Trabajador de fondo
Buscar..
Usando BackgroundWorker
Ejecutando una tarea con el trabajador de fondo.
Haga doble clic en el control BackgroundWorker
de la caja de herramientas
Así es como aparece BackgroundWorker después de agregarlo.
Haga doble clic en el control agregado para obtener el evento BackgroundWorker1_DoWork
y agregue el código que se ejecutará cuando se llame a BackgroundWorker. Algo como esto:
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
'Do the time consuming background task here
End Sub
Se puede llamar a BackgroundWorker para realizar la tarea en cualquier evento como Button_Click
, Textbox_TextChanged
, etc. de la siguiente manera:
BackgroundWorker1.RunWorkerAsync()
Modifique el evento RunWorkerCompleted
para capturar el evento de tarea terminada del BackgroundWorker de la siguiente manera:
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
MsgBox("Done")
End Sub
Esto mostrará un cuadro de mensaje que dice Done
cuando el trabajador finalice la tarea asignada.
Accediendo a los componentes GUI en BackgroundWorker
No puede acceder a ningún componente GUI desde BackgroudWorker. Por ejemplo, si intentas hacer algo como esto.
Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
TextBox1.Text = "Done"
End Sub
recibirá un error de tiempo de ejecución que dice que "La operación de subprocesos no es válida: control 'TextBox1' al que se accede desde un subproceso que no sea el que se creó".
Esto se debe a que BackgroundWorker ejecuta su código en otro subproceso en paralelo con el subproceso principal, y los componentes de la GUI no son seguros para subprocesos. Debe configurar su código para que se ejecute en el subproceso principal utilizando el método Invoke
, dándole un delegado:
Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
Me.Invoke(New MethodInvoker(Sub() Me.TextBox1.Text = "Done"))
End Sub
O puede usar el método ReportProgress de BackgroundWorker:
Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
Me.BackgroundWorker1.ReportProgress(0, "Done")
End Sub
Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs)
Me.TextBox1.Text = DirectCast(e.UserState, String)
End Sub