Este é um post disponível para assinantes MVPCriando aplicações Multitarefa – Revista .net Magazine 91
O artigo mostra um recurso em aplicações Windows Forms e WPF para executar trabalhos em segundo plano. Considera as alternativas de implementação de multitarefas existentes em comparação com o componente BackgroundWorker. Também mostra alternati
[Artigo já está disponível no Leitor Digital DevMedia®. Clique aqui para acessá-lo]
> Clique aqui para ler todos os artigos da .net Magazine 91
Desde as versões iniciais, o C# oferece suporte a multitarefas principalmente através do uso da classe System.Threads.Thread e seus recursos. É possível implementar, com algum trabalho, códigos para dividir as tarefas. A principal motivação para isto é que os computadores existentes nos dias atuais são desenvolvidos para executarem um maior número de processos simultaneamente.
Desde a multitarefa preemptiva em que cada tarefa recebia um ciclo de tempo de computador até os computadores com vários núcleos, a necessidade de executar mais código simultaneamente permanece forte e quando se está usando um programa executado no Desktop esta necessidade é mais forte ainda.
Acontece que nenhum usuário gosta da ampulheta do Windows ou, ver a janela da sua aplicação esbranquiçar e o Windows escrever “Não está respondendo...”.
Para evitar este comportamento da aplicação e consequente
irritação do usuário, é importante conhecer os recursos do .NET Framework para
implementar multitarefas. As principais
classes para isso são System.Threading.Thread, System.Timers.Timer e
System.ComponentModel.BackgroundWorker.
Cada uma possui recursos para controlar o início, término e cancelamento de um trabalho executado em segundo plano. O mais interessante para desenvolvedores de aplicações Desktop com certeza é o BackgroundWorker pois é o que permite implementar multitarefas de uma maneira mais simples e clara.
O seu uso com aplicações Windows Forms é bastante facilitado graças a possibilidade de arrastar este controle para o design gráfico e configurar suas principais propriedades visualmente. Contudo, há algum tempo já vem tomando força e adoção por parte dos desenvolvedores outra plataforma para aplicações Windows conhecida como Windows Presentation Foundation (WPF).
Neste artigo, será apresentada uma introdução sobre os principais problemas a serem resolvidos com o trabalho de multitarefas e em seguida, através de uma aplicação de exemplo, será mostrado como integrar o controle BackgroundWorker em uma aplicação WPF.
Thread
Thread é uma classe do namespace System.Threading. Esta possui elementos para que uma tarefa seja executada em segundo plano liberando assim, o fluxo do programa para executar outras tarefas, como por exemplo, apresentar dados para o usuário ou aguardar algum comando seu.
Um esquema bom para entender o funcionamento de multitarefa é usar um fluxo onde o trabalho paralelo ocorre ao mesmo tempo que outros. A Figura 1 pode ser usada para isto.
Considere cada retângulo como uma porção de código a ser executado. Cada com um seu fluxo próprio de dados, cada um com seus blocos lógicos e tratamentos que precisam ser feitos.
O que o Framework faz quando uma instância da classe Thread é chamada e configurada para executar um determinado trabalho, é providenciar métodos e propriedades para o gerenciamento destes.
Isto porque quando se trata de processamento paralelo alguns aspectos importantes precisam ser levados em conta tais como:
1. Início da tarefa;
2. Controle de regiões críticas – aqui é onde objetos compartilhados são acessados. Deve haver um controle para que dois processos concorrentes não tentem ler ou modificar o mesmo objeto ao mesmo tempo e criar assim inconsistências;
3. Interrupção – permitir pausar a thread momentaneamente;
4. Retorno – controlar como retornar uma thread pausada;
5. Cancelamento – como fazer para cancelar a thread e ainda assim, manter dados e objetos compartilhados em estado consistente;
6. Finalização – concluir o trabalho que foi delegado para um processo paralelo.
O uso da classe thread pode ser feito em qualquer tipo de código, principalmente em casos onde os outros componentes como BackgroundWorker e Timers não estão disponíveis, como em um processo dentro de um assembly do tipo Class Library.
O processamento paralelo é um assunto tão importante que a próxima versão da linguagem C#, 5.0, irá trazer melhorias neste aspecto. Uma das mais interessantes será a possibilidade de tornar um método ou porção de código em assíncrono (executado paralelamente) apenas usando poucas instruções.
Já existem documentações a respeito, procure informações sobre “C# 5 e Multithreading” no Google.
Timer
Esta classe deve ser usada quando tarefas precisarem ser executadas em intervalos regulares de tempo. Ela por si só executa apenas a contagem do intervalo de tempo que deve ser informado em milissegundos na propriedade Interval. Quando a instância da classe está ativa, cada vez que o tempo for concluído, é disparado o método associado com o evento Elapsed. Neste evento sim pode se usar um código dentro de uma Thread ou até mesmo com o componente BackgroundWorker.
É importante observar que para as aplicações Windows Forms existe um controle não visual com o mesmo nome: System.Windows.Forms.Timer que pode ser arrastado para o designer e ter o seu intervalo igualmente configurado em milissegundos.
Porém, duas coisas diferem do primeiro. Primeiramente, não há o evento Elapsed, mas sim Tick, que dispara o código associado a este quando o tempo for atingido. Segundo, a sua precisão é de 55 milissegundos e não tem um bom desempenho com multitarefas. Na documentação do Framework é feita uma recomendação para que não seja usado em cenários de multitarefas.
BackgroundWorker
Este controle não visual está presente desde a versão 2.0 do Framework e o principal objetivo, como já foi visto é permitir implementar multitarefas de forma transparente.
A sua principal vantagem é oferecer propriedades e eventos para controlar de maneira mais estruturada a execução de código em processos paralelos.
Para usar este controle os seguintes passos devem ser tomados pelo programador:
1. Criar uma instância deste controle arrastando o mesmo da aba Components da toolbox quando criado um projeto Windows Forms;
"ATENÇÃO! A exibição deste artigo foi interrompida.
Este é um post disponível para assinantes MVP
Space do autor


0
0
