NetCódigo e Internet

El conocimiento es un bien que crece a medida que se comparte

Hilos con windows forms. BackgroundWorker

Si queremos evitar el típico "No responde" que se produce en aplicaciones que ejecutan procesos que pueden exigir mucho tiempo para su finalización, la solución pasa por usar hilos independientes. Nomalmente, este mensaje no siginifica que esté bloqueada, sino que el proceso llamado o dependencias del mismo no responden de la manera adecuada. Para ello disponemos de una clase, BackgroundWorker. Nos permite ejecutar una operación en un hilo independiente y dedicado. Esto, entre otras cosas, permite que la interfaz de la aplicación no deja de responder ya que nada satura su hilo propio. Para controlar el objeto disponemos de los siguientes eventos públicos: Con ellos controlaremos la vida del hilo que se ha creado. Para realizarlo habrá que agregar un controlador para el evento DoWork. Será aquí desde donde llamaremos a nuestra operación que deseamos lanzar. Para hacerlo utilizaremos el método RunWorkerAsync y para controlar la vida del mismo usaremos ProgressChanged y RunWorkerCompleted. ProgressChanged. Para que se dispare se debe utilizar el método ReportProgress, recibe como parámetro el porcentaje la operación que se ha ejecutado (percentProgress). RuWorkerCompleted. Se dispara cuando el hilo finaliza, se cancela o produce una excepción. Contiene argumentos que nos proporcionaran información al respecto. Aquí podremos interrogar al argumento correspondiente del evento RunWorkerCompletedEventArgs. Sus propiedades:
  • Result, nos devolverá el resultado del hilo.
  • Error, devuelve el valor correspondiente al error producido.
  • Cancelled, informa si el proceso fué cancelado. Es un booleano.
Su uso no es nada complejo y nos servirá para conseguir satisfacción en los usuarios. Se evita el posible pensamiento de "esto se ha bloqueado", además, podemos facilitarle información sobre el estado en el que se encuentra el proceso. A continuación se muestra un ejemplo de uso de BackgroundWorker. Es un ejemplo sencillo, simplemente el proceso lanza un bucle de 1 a 100 y para cada salto espera 500 milisengundos. Con esto conseguimos realizar una operación que require mucho tiempo. Además se proporciona un botón para cancelar la operación.

BackgroundWorker


Código.

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' INICIA PROCESO
Me.ProgressBar1.Maximum = 100
Me.Button1.Enabled = False
Me.Button2.Enabled = True
' LLAMADA A INICIALIZACION DEL PROCESO
BackgroundWorker1.RunWorkerAsync()
End Sub

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
' LLAMADA AL PROCESO
Me.Proceso()
End Sub

Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
' PROGRESO DEL PROCESO
ProgressBar1.Value = e.ProgressPercentage
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
' FIN DEL PROCESO
If (e.Error IsNot Nothing) Then
MessageBox.Show(e.Error.Message)
End If
Me.Button2.Enabled = False
Me.Button1.Enabled = True
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
' CANCELACION DEL PROCESO
Me.BackgroundWorker1.CancelAsync()
End Sub

Private Sub Proceso()
' PROCESO
Dim i As Integer

For i = 1 To 100
If Me.BackgroundWorker1.CancellationPending = True Then
MsgBox("El proceso se canceló")
Exit Sub
End If

BackgroundWorker1.ReportProgress(i)
Threading.Thread.Sleep(500)
Next

End Sub

 

Espero no haberme liado demasiado y que se entienda. De cualquier forma, deciros que es más sencillo usar este control que trabajar directamete con Threads (hilos).

Bajar código

Leave a Comment

(required) 

(required) 

(optional)

(required) 


Enter the numbers above: