Neste artigo vou comentar sobre as diferenças entre Tasks e Threads. |
Threads - Linha de execução (em inglês: Thread), é uma forma de um processo dividir a si mesmo em duas ou mais tarefas que podem ser executadas concorrentemente. (System.Threading)
Tasks - Uma tarefa (ou task) representa uma unidade de trabalho que deverá ser realizada. (System.Threading.Tasks )
No código abaixo temos o código usando uma Thread e a seguir uma Task:
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Cshp_TaskThreds
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Iniciando uma Thread com delay de 5 s");
//Threads
Thread th = new Thread(() =>
{
Thread.Sleep(5000);
});
Console.WriteLine("Iniciando uma Task com delay de 5 s");
//Tasks
Task t = Task.Factory.StartNew(() =>
{
Thread.Sleep(5000);
});
Console.ReadLine();
}
}
}
|
Perceba que aparentemente não existe muita diferença.
Ao executar o código você vai notar que na execução da Thread vai esperar pelos 5 segundos até terminar.
Já a execução da Task ocorre instantaneamente sem o delay de 5 s.
O que acontece é que no caso da Task é criada uma thread em background para a qual a thread principal não vai aguardar a execução para concluir.
Uma Task ou
tarefa é algo que você deseja fazer.
Uma Thread é um dos muitos possíveis
trabalhadores que executa essa tarefa.
Na plataforma .NET , uma Task representa uma
operação assíncrona. Já as Thread(s) são
usadas para concluir essa operação, quebrando o
trabalho em pedaços e atribuindo-os as
threads(segmentos) separados.
Assim , uma Task (Tarefa)
é uma promessa, ou seja, uma Task<T> promete
devolver um T, e isso pode não ser agora, pode ser
mais tarde.
Uma Thread é uma forma de cumprir essa promessa. Mas
nem todas as Tasks precisam de uma nova Thread. Na
verdade, criar uma thread quase sempre não é
desejável, pois tem um alto custo, assim é mais
fácil reutilizar uma thread existente do
threadpool.
Dessa forma uma Task possui as seguintes vantagens
em termos de recursos sobre as threads:
- Se
o sistema tiver várias Tasks, então ele faz uso do
pool de threads interno da CLR e, portanto, não tem
a sobrecarga associada à criação de uma thread
dedicada usando uma Thread;
- Uma Task pode retornar um resultado. Não há
mecanismo direto para retornar o resultado de uma
Thread;
- Podemos encadear Tasks em conjunto para executar
uma após a outra;
- Estabeleça um relacionamento pai / filho quando
uma tarefa é iniciada a partir de outra tarefa;
- Uma exceção de uma Task filha pode propagar para a
Task pai; Ao usar uma thread se ocorrer uma exceção
não é possível capturá-la na função Pai.
- Uma Task suporta o cancelamento de tarefas através
do uso de tokens de cancelamento;
- Podemos usar as palavras chaves 'async' e 'await'
para implementar facilmente operações assíncronas em
uma Task;
Simples assim.
E estamos conversados...
"Se alguém me
serve, siga-me, e onde eu estiver, ali estará também o meu servo. E, se
alguém me servir, meu Pai o honrará. "
João 12:26
Referências: