Curso Windows Phone – Execução de rotinas em background (BackgroundWorker / Multithread – WP7)

Olá pessoal, tudo bom?

Em várias ocasiões nos deparamos com situações onde mais de uma coisa deve acontecer no software ao mesmo tempo (multithreading), seja execução de processos diferentes e/ou atualização de componentes de tela enquanto algum processo ainda está em execução.

Para resolução de situações parecidas com essa, uma das soluções pertinentes, seria a criação de rotinas que possam ser executadas em segundo plano, “liberando” assim outras rotinas de software para que também possam ser executadas.

A execução de rotinas em segundo plano é controlada por uma classe chamada BackgroundWorker. Vejam abaixo um exemplo de como utilizá-la:

1) Logo abaixo da declaração da classe da página onde o multithreading será necessário, instancie um objeto da classe BackgroundWorker

...
public partial class Toggle_Progress : PhoneApplicationPage
{
   private BackgroundWorker bw = new BackgroundWorker();
   ...
   ...
}

2) No construtor da classe, indique características e métodos que deverão ser tratados para o objeto da classe BackgroundWorker:

...
public Toggle_Progress()
{
   InitializeComponent();
   //Indica que você gostaria de reportar o progresso da execução da rotina de segundo plano
   bw.WorkerReportsProgress = true;
   //Indica que a rotina de segundo plano poderá ser cancelada
   bw.WorkerSupportsCancellation = true;
   //Definição do método que irá executar a rotina em segundo plano
   bw.DoWork += new DoWorkEventHandler(bw_DoWork);
   //Definição do método que irá tratar da progressão do processo
   bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
   //Definição do método que será executado após a conclusão do processo em segundo plano
   bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
}
...
...

3) No método bw_DoWork você deve então executar as rotinas que queira que aconteçam em segundo plano, veja um exemplo:

...
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
   BackgroundWorker worker = sender as BackgroundWorker;
   for (i = 1; i < 1000000000; i++)
   {
      if (worker.CancellationPending == true)
      {
         e.Cancel = true;
         break;
      }
      else
      {
      if (i % 1000 == 0)
         worker.ReportProgress((i/1000000000)*100); //Chamada ao método bw_ProgressChanged
      }
   }
}
...
...

4) O método bw_ProgressChanged você deve executar a ação que quiser para cada vez que o mesmo for acionado


private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
   txtContagem.Text = i.ToString();
}

5) Já no método bw_RunWorkerCompleted execute alguma ação que você queira logo após o encerramento do processo que estava em execução em segundo plano


private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
   progressBar.IsIndeterminate = false; //Por exemplo, finalize uma barra de progressão
   ...
   ...
}

Realizados todos os passos acima, basta agora invocar a criação do processo em segundo plano a partir do clique de um botão ou de alguma outra ação que esteja vinculada ao seu programa, por exemplo:


//Nesse exemplo simulo o clique em um elemento do tipo ToggleSwitch e então habilito uma barra de progressão que deve ficar ativa enquanto o processo em segundo plano não terminar.
private void tsProgressBar_Click(object sender, RoutedEventArgs e)
{
   if (tsProgressBar.IsChecked == true)
   {
      tsProgressBar.Content = "Desabilitar ProgressBar";
      progressBar.IsIndeterminate = true;
      if (bw.IsBusy != true)
         bw.RunWorkerAsync(); //Isso fará o método bw_DoWork ser executado
   }
   else
   {
      tsProgressBar.Content = "Habilitar ProgressBar";
      progressBar.IsIndeterminate = false;
      if (bw.WorkerSupportsCancellation == true)
         bw.CancelAsync(); //Isso finaliza a execução do método em segundo plano.
   }
}

Bem, espero que esse post possa ajudar.

Grande abraço,
Eduardo Henrique Rizo

Post relacionado:

Curso Windows Phone – Tópicos

Anúncios

Coordenador de Internet da Universidade do Oeste Paulista (Unoeste) e professor universitário de disciplinas relacionadas ao desenvolvimento de sistemas para Web, gerenciamento de servidores, serviços e redes.

Marcado com: , , , ,
Publicado em Windows Phone
10 comentários em “Curso Windows Phone – Execução de rotinas em background (BackgroundWorker / Multithread – WP7)
  1. […] Execução de rotinas em background (BackgroundWorker – Multithread) […]

  2. Ewerton disse:

    Olá,
    Eu estou pensando em fazer uma aplicação que avisaria ao usuário todo dia (no horário que ele escolher) que ele tem de fazer determinada tarefa.

    Como eu faria isto ?
    Eu estava lendo sobre background agents
    http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh202941(v=vs.105).aspx

    Mas vi o código lá e funciona muito no debug eu usaria ele mesmo ou tem outra maneira por exemplo de eu acessar o calendário ou o alarme e criar uma tarefa para todo dia ?

    Grato desde já.

  3. AS Silv disse:

    Genial e objetivo. Muito Obrigado

  4. Thiago Rossato disse:

    É possivel , dessa maneira, executar varios audios ao mesmo tempo?

  5. Wedson Araújo disse:

    Cara eu fiz tudo certinho mais só funciona quando o visual studio está depurando.
    no meu código ele atualiza uma variável inteira. Mais sempre que testo app sem está conectado ao visual studio o código não funciona. SÓ FUNCIONA QUANDO A APP ESTÁ EN PRIMEIRO PLANO.
    Quando clico no back e deixo na tela iniciar ele não executa as tarefas que estão no código.

    Na verdade ele está atualizando um listplayer de músicas a cada música que termine de tocar passa pra outra música. e ele não faz isso.

    se poder me ajudar agradeço.

  6. […] Execução de rotinas em background (BackgroundWorker – Multithread) […]

Deixe um comentário

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

Sorocaba e Região
Prestadora de serviços RIZZO GS - Sorocaba/SP

Serviços de limpeza, conservação, recepção, copa, portaria, vigia, zeladoria, jardim, elétrica, hidráulica, pintura, etc.

Contato: (15) 3357-4263 / (15) 3357-4502 - contato@rizzogs.com.br

Website: http://www.rizzogs.com.br

%d blogueiros gostam disto: