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

[twitter-follow screen_name=’eduardorizo’ show_count=’yes’]

Post relacionado:

Curso Windows Phone – Tópicos

10 comentários em “Curso Windows Phone – Execução de rotinas em background (BackgroundWorker / Multithread – WP7)”

  1. Pingback: Curso Windows Phone – Tópicos « Blog do Eduardo H. Rizo

  2. 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. Pingback: Curso Windows Phone – Como criar uma Splash Screen Page com ações em background | Blog do Eduardo H. Rizo

  4. 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.

    1. Olá Wedson, tudo bom?
      Desculpe a demora em relação a sua pergunta, mas eu estava de férias.
      Bem, o post em questão trata tarefas em multithread e nesse caso a aplicação deve estar em primeiro plano (running) para que várias coisas (threads) possam acontecer ao mesmo tempo.
      Eu acho que você está precisando é de outro recurso do Windows Phone chamado PeriodicTask. Peço que leia esse outro post do meu Blog: Curso Windows Phone – Como desenvolver APPs com tarefas em segundo plano.

      Abraços,
      Eduardo H. Rizo

  5. Pingback: [Desenvolvimento] Como criar uma Splash Screen Page com ações em background - Windows Team

Deixe um comentário