DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

  Este é um post disponível para assinantes MVP
Este post também está disponível para assinantes da .net Magazine DIGITAL ou para quem possui Créditos DevMedia.  Clique aqui para saber mais!


Criando 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






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
Este post também está disponível para assinantes da .net Magazine DIGITAL ou para quem possui Créditos DevMedia.  Clique aqui para saber mais!






    0 COMENTÁRIO

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.


Nenhum comentário foi postado - seja o primeiro a comentar!



[Este post ainda não foi associado a uma sequência]
Publicidade
Autor
Vladimir Rech

Tecnólogo em Desenvolvimento de Sistemas pelo CEFET-PR, palestrante; trabalha com desenvolvimento de sistemas em .NET destacando-se aplicações Windows, ASP e Web Services.


Space do autor
Estatísticas
Favorito:
Comentários:
Feedback:
Utilidade:
0   0
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]


Este post está fechado. Saiba mais sobre a assinatura MVP!
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03