Dando sequencia as novas “features” do .NET 2.0 (já que só falam disso :P), eis aqui uma nova classe para trabalharmos em nossas aplicações. Como o próprio nome da classe diz, BackgroundWorker, você pode criar uma nova tarefa para este executar em modo assíncrono, e com isso uma nova Thread é criada para a execução deste trabalho.
Esta classe é composta por dois principais eventos: DoWork e RunWorkerCompleted. O evento DoWork é disparado quando é iniciado o trabalho que este terá que fazer. Já o RunWorkerCompleted, é disparado quando o processo assíncrono, que está sendo executado, é finalizado.
Para iniciarmos o processo, chamamos o método RunWorkerAsync do objeto BackgroundWorker, que tem um overload, onde você pode passar algum parâmetro do tipo Object para a rotina. Para ilustrarmos o processo, vamos carregar assincronamente um DataGridView com os dados vindos de uma DB, neste caso, Northwind. O código para isso é:
Imports System.Data
Imports System.Data.SqlClient
Public Class Form1
Private WithEvents worker As New System.ComponentModel.BackgroundWorker
Private table As DataTable
Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
worker.RunWorkerAsync()
End Sub
Private Sub worker_DoWork( _
ByVal sender As Object, _
ByVal e As System.ComponentModel.DoWorkEventArgs) _
Handles worker.DoWork
Using conn As New SqlConnection(“Server=localhost;Integrated Security=True;Database=Northwind”)
Dim adapter As New SqlDataAdapter(New SqlCommand(“SELECT * FROM Customers”, conn))
table = New DataTable
adapter.Fill(table)
End Using
End Sub
Private Sub worker_RunWorkerCompleted( _
ByVal sender As Object, _
ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) _
Handles worker.RunWorkerCompleted
LoadData()
End Sub
Private Sub LoadData()
Me.DataGridView1.DataSource = table
End Sub
End Class
Como podemos ver, no evento Click do botão chamamos o método RunWorkerAsync, que dispara/processa o código do evento DoWork. No exemplo acima, resgatamos os dados da tabela Customers do Banco de Dados Northwind assincronamente e quando finalizado, o evento RunWorkerCompleted é invocado e assim chamamos a rotina que define o DataTable como DataSource do controle DataGridView.
Nota: O que se deve ter atenção é que você não pode atualizar os controles de UI dentro deste processo porque eles (controles de UI) podem ser atualizados apenas pela Thread que os criaram – a Thread que chamou a UI – exatamente por isso que a definição do DataSource (que atualiza o controle) é desvinculada do evento de carga do DataTable.