 C#  -  Task e Thread (revisitado)
 
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