Buscar..


Usando BackgroundWorker

Ejecutando una tarea con el trabajador de fondo.

Haga doble clic en el control BackgroundWorker de la caja de herramientas

Control de BackroundWorker en Toolbox

Así es como aparece BackgroundWorker después de agregarlo.

introduzca la descripción de la imagen aquí

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


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow