C# -  Tasks x Threads. Qual a diferença ?


 Neste artigo vou comentar sobre as diferenças entre Tasks e Threads.

Vamos começar com a definição de Tasks e de 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:


José Carlos Macoratti