C# - Task e Thread (revisitado)
Se você não conhece a diferença entre Task e Thread hoje veremos as definições e usos destes recursos. |
A plataforma .NET oferece a classe Threading.Tasks que permite criar tarefas e as executar de forma assíncrona. Uma tarefa é um objeto que representa algum trabalho que deve ser feito. A tarefa pode informar se o trabalho foi concluído e se a operação retornar um resultado, a tarefa fornecerá o resultado.
Dessa forma uma tarefa (ou task) representa uma unidade de trabalho que deverá ser realizada. Esta unidade de trabalho pode rodar em uma thread separada e é também possível iniciar uma task de forma sincronizada a qual resulta em uma espera pela thread chamada. Com tasks, você tem uma camada de abstração mas também um bom controle sobre as threads relacionadas.
E que é uma Thread ?
Um Thread é um pequeno conjunto de instruções executáveis e a plataforma .NET possui as classes associadas a threads no namespace System.Threading.
Assim, uma thread é definida como o caminho de execução de um programa onde cada thread define um fluxo de controle exclusivo. Se seu aplicativo envolve operações complicadas e demoradas, geralmente é útil definir diferentes caminhos ou threads de execução, com cada thread executando um trabalho específico.
Por que precisamos
de Tasks ?
Elas podem ser usadas sempre que você quiser executar algo em paralelo. A
implementação assíncrona é fácil em uma Task, usando as palavras-chave
'async' e 'await'.
Por que precisamos de uma Thread ?
Quando chega o momento em que o aplicativo é obrigado a executar poucas tarefas
ao mesmo tempo.
O recurso Multi-threading é o mais útil do C# que permite a programação simultânea de duas ou mais partes do programa para maximizar a utilização da CPU. Cada parte de um programa é chamada de Thread, assim, as threads são processos leves dentro de um processo e a linguagem C# suporta dois tipos de threads:
1- Threads de
primeiro plano
Uma thread que continua rodando para completar seu trabalho mesmo que a thread
principal saia de seu processo, esse tipo de thread é conhecida como thread de
primeiro plano. A thread de primeiro plano não se importa se a thread principal está ativa ou não, ela é concluída apenas quando termina
seu trabalho. Assim a vida da thread de primeiro plano não depende da thread principal.
Exemplo:
// Criando e inicializando uma thread Thread thread1 = new Thread(MinhaThread); thread1.Start(); Console.WriteLine("A thread principal encerrou!!"); Console.ReadLine(); static void MinhaThread() |
2- Thread de
segundo plano
O conceito da thread de segundo plano é o oposto da thread de primeiro plano,
ela encerra seu trabalho quando a thread principal for encerrada e a vida
útil das threads de segundo plano depende da thread principal. Se você quiser usar uma thread em segundo plano em seu programa, defina o
valor da propriedade IsBackground da thread como
true.
Exemplo:
// Cria e inicializa a thread Thread thread1 = new Thread(MinhaThread); thread1.Name = "thread1"; thread1.Start(); thread1.IsBackground = true; Console.WriteLine("A thread principal encerrou!!"); static void MinhaThread() |
Como criar uma Task ?
Na linguagem C# para criar e executar uma Task em uma nova thread existem muitas formas.
1- Método clássico :
Task.Factory.StartNew(() => { Console.WriteLine(“Olá Task :D”); } |
2- Usando um delegate
Task task = new Task(delegate { Imprimir(); }); task.Start(); Console.ReadLine(); void Imprimir() |
3- Usando uma expressão lambada
Task task = new Task(() => { Imprimir(); }); task.Start(); Console.ReadLine(); void Imprimir()
|
Como criar uma Thread
As threads são criadas estendendo a classe
Thread. A classe Thread
estendida então chama o método Start() para
iniciar a execução da thread
filho.
Thread thread = new Thread(new ThreadStart(MeuMetodo)); thread.Start(); Console.ReadLine(); void MeuMetodo()
|
Diferenças entre
tarefa e thread
Para concluir aqui estão algumas diferenças entre uma Task e um
Thread :
De forma geral usar Task é quase sempre a melhor opção; ela fornece uma API muito mais poderosa e evita o desperdício de threads do SO.
E estamos conversados...
"E o seu
mandamento é este: que creiamos no nome de seu Filho Jesus Cristo, e nos
amemos uns aos outros, segundo o seu mandamento."
1 João 3:23
Referências:
ASP .NET - Gerando QRCode com a API do Google
C# 9.0 - Instruções de nível superior
ASP.NET Core Web API - Apresentando API Analyzers
ASP.NET Core - Usando o token JWT com o Swagger
Gerando a documentação da Web API com Swagger