msdn34_capa.jpg

Clique aqui para ler todos os artigos desta edição

 

Uma introdução ao uso de Threads – Parte II

Roberto Lopes

 

Roberto Lopes (robertoctlopes@yahoo.ca) é Sr. Systems Analyst na empresa Direct Energy em Toronto/Canadá; foi durante vários anos instrutor de Visual Basic no Senac/SP e é certificado Microsoft (MCP, MCAD.NET). Trabalha com plataforma Microsoft utilizando C#, ASP.NET, SQL Server e Oracle em projetos web, cliente/servidor e multicamadas. Também é responsável pelas tecnologias SQL Server, ASP.NET e Arquitetura no .NET User Group Build Developers (www.builddevelopers.net).

 

Na primeira parte deste artigo (edição 33) apresentei na prática, de uma forma bem simples, como criar uma segunda linha de processamento em um aplicativo. Nesta segunda parte, vou procurar manter a simplicidade, mostrando como encerrar/interromper uma thread de maneira correta e por fim, vou mostrar como ficou fácil passar parâmetros para uma thread com o .NET Framework 2.0.

Modo correto de finalização de uma thread

Para encerrar um aplicativo que cria threads durante a sua execução, é preciso primeiramente encerrar todas as threads ativas para que a principal seja encerrada, ou seja, o aplicativo seja encerrado (apenas lembrando: No .NET Framework, threads são criadas por default como foreground. Veja o box sobre diferenças entre background e  foreground).

 

Diferenças entre Background e Foreground Threads

A grande diferença entre uma thread ser background ou foreground é o fato de foreground threads não serem encerradas quando a principal é terminada. No caso de background threads, quando a principal é encerrada, todas as background threads também são encerradas.

Por isso, é preciso ter muito cuidado ao definir uma thread como background, pois independente do processo que esteja sendo realizado na mesma, só pelo fato de ter sido configurada como background, ela será terminada em qualquer ponto do processo.

No .NET Framework todas as threads instanciadas e iniciadas a partir do objeto Thread, são definidas por default como foreground.

 

O melhor local para esse processo ser colocado (de encerrar as threads ativas) é no override do Dispose. Desse modo, não precisaremos nos preocupar, pois temos certeza que o método que encerrará as threads ativas realmente será chamado antes da thread principal ser encerrada. Isso porque você não precisa chamar o Dispose, ele será chamado automaticamente pelo .NET Framework.

Vamos ver na prática. Crie um novo aplicativo do tipo Windows Forms. Assim como nos exemplos anteriores, para manter os aplicativos mais simples, não mudarei as propriedades dos objetos a serem utilizados (apenas os realmente necessários).

Adicione um botão ao aplicativo, mantendo o valor default da propriedade Name (“button1”) e mude a propriedade Text para “Iniciar”. Esse botão servirá para iniciar a thread. No arquivo de código (Form1.cs), adicione no using, o código a seguir, referenciando o namespace Threading:

 

using System.Threading;

 

Declare duas variáveis de classe, sendo uma do tipo Thread e outra do tipo Form1, conforme o seguinte código:

 

public partial class Form1 : Form

{

   Thread myThread;

   Form1 frmForm1;

   ...

 

Adicione o código a seguir ao evento Load, onde uma nova instância de cada variável (frmForm1 e myThread) será criada.

 

frmForm1 = new Form1 ...

Quer ler esse conteúdo completo? Tenha acesso completo