System.ComponentModel.BackgroundWorker


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.

Anúncios

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s