Primeiras aulas do curso Certificação C# Programming parte 11: Multithreading

Certificação C# Programming parte 11: Multithreading

Introdução ao Task Parallel Library - Introdução

Boas Vindas! Sou o instrutor Marcelo Oliveira.

Este é o curso Certificação 70-483 Programação em C# - Parte 11: Multithreading onde veremos sobre processamento multithreading e assíncrono.

Começaremos pela biblioteca Task Parallel ou TPL, a qual permite que iniciemos múltiplas tarefas ao mesmo tempo utilizando os métodos Parallel.For e Parallel.Foreach.

Abordaremos as consultas integradas à linguagem PLINQ vista anteriormente e aplicadas ao paralelismo, melhorando a performance.

Aprenderemos também sobre as tarefas ou tasks, as quais podem ser usadas como unidade de trabalho assíncrono.

Veremos sobre o tipo de classe ou objeto ThreadPool que permite a criação de diversos pools pra melhorar o processamento e otimizar a aplicação, aproveitando os recursos dos núcleos de sua máquina.

Aprenderemos a desbloquear a interface do usuário ou IU, impedindo que um processo trave a thread principal da aplicação, a qual fará a renderização de um formulário no caso de aplicação em Windows Forms.

Ainda abordaremos o uso das palavras async e await para permitir a programação assíncrona em um programa C#. Utilizaremos também as Coleções Simultâneas para impedir que várias threads possam corromper os dados de alguma coleção.

Passaremos pelo gerenciamento de multithreading, começando pela implementação de bloqueio e estabelecendo que um grupo de código seja protegido contra o acesso simultâneo de várias threads independentes que poderiam corromper os dados de uma aplicação.

Veremos como cancelar tarefas de longa duração, ou seja, as tasks podem ser canceladas conforme necessitamos. Identificaremos as condições de corrida ou condições de concorrência que podem afetar os dados e a consistência da aplicação, resolvendo problemas com os métodos thread-safe.

Esperamos que este curso seja de grande utilidade, e nos vemos nas aulas!

Introdução ao Task Parallel Library - Tarefas em Série e em Paralelo

A terceira tarefa é processar 100 itens em paralelo - percorrendo uma coleção.

Começamos pulando uma linha com Console.WriteLine() após o bloco da tarefa 2, adicionando uma mensagem que exibe a tarefa 3.

Esta coleção ainda não existe, pois estamos trabalhando somente com faixas até agora. Para transformá-la em coleção de números de 0 a 99, basta trabalharmos com a classe Enumerable.Range() que recebe como parâmetro o valor inicial e a contagem de itens.

Este método devolve um enumerável de inteiros, justamente o que precisamos. Armazenamos o resultado e geramos a coleção em uma variável chamada Itens que será trabalhada com outro método da classe de paralelismo chamada Parallel.ForEach().

O segundo parâmetro é a action Processar() que receberá um item de 0 a 99.

static void Main(string[] args)
{
//código omitido

    Console.WriteLine("Tarefa 2: processar 100 itens em paralelo - percorrendo uma faixa");
        Parallel.For(0, 100, (i) => Processar(i));
    Console.ReadLine();

    Console.WriteLine("Tarefa 3: processar 100 itens em paralelo - percorrendo uma coleção");
    var itens = Enumerable.Range(0, 100);
    Parallel.ForEach(itens, (item) => Processar(item))

    Console.WriteLine("Término do processamento. Tecle [ENTER] para terminar.");
    Console.ReadLine();
}

Testamos a implementação com "F5" e observamos os três tipos de processamentos no console.

Para terminar, faremos a medição dos tempos; paramos a aplicação e adicionamos ao código as funções que iniciam, param e reiniciam o cronômetro':

static void Main(string[] args)
{
//código omitido

    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();
    Console.WriteLine("Tarefa 1: processar 100 itens em série");
    for (int i = 0; i<100; i++)
    {
        Processar (i);
    }
    stopwatch.Stop();
    Console.WriteLine("Tempo decorrido: {0} segundos",
        stopwatch.ElapsedMilliseconds / 1000.0);

    Console.WriteLine();

    stopwatch.Restart();
    Console.WriteLine("Tarefa 2: processar 100 itens em paralelo - percorrendo uma faixa");
        Parallel.For(0, 100, (i) => Processar(i));
        stopwatch.Stop();
    Console.WriteLine("Tempo decorrido: {0} segundos",
        stopwatch.ElapsedMilliseconds / 1000.0);

    Console.WriteLine();

    stopwatch.Restart();
    Console.WriteLine("Tarefa 3: processar 100 itens em paralelo - percorrendo uma coleção");
    var itens = Enumerable.Range(0, 100);
    Parallel.ForEach(itens, (item) => Processar(item))
    stopwatch.Stop();
    Console.WriteLine("Tempo decorrido: {0} segundos",
        stopwatch.ElapsedMilliseconds / 1000.0);

    Console.WriteLine("Término do processamento. Tecle [ENTER] para terminar.");
    Console.ReadLine();
}

Rodamos o programa para observar os tempos decorridos dos tipos de processamento, e constatamos que os dois últimos são expressivamente mais rápidos.

Assim, podemos trabalhar com muitos itens em paralelo em faixa ou coleção de valores, otimizando o tempo de execução.

Introdução ao Task Parallel Library - Tempo em Série e em Paralelo

A vantagem da execução paralela em relação a sequencial se dá no desempenho.

Usando uma abordagem científica, podemos investigar com precisão medindo o tempo de execução dos processos, o que nos levando à terceira tarefa. Para isso, utilizamos a classe cronômetro declarando a variável de tipo stopwatch e importando o namespace desta com a tecla "Ctrl" para selecionar "StopWatch - using System.Diagnostics; > using System.Diagnostics".

Antes de entrar no processamento em série, iniciamos nosso cronômetro com o método Start() e o paramos com Stop(). Adicionamos uma mensagem ao console com Console.WriteLine() definindo o tempo decorrido com índice {0} medido através do parâmetro ElapsedMilliseconds. Como queremos que a unidade de medida seja em segundos quebramos uma linha e convertemos o resultado por uma divisão.

static void Main(string[] args)
{
    //TAREFA 1: Cozinhar e refogar EM SÉRIE
    //TAREFA 2: Cozinhar e refogar EM PARALELO
    //TAREFA 3: Medir o tempo dos 2 procedimentos

    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();
    CozinharMacarrao();
    RefogarMolho();
    stopwatch.Stop();
    Console.WriteLine("Tempo decorrido: {0} segundos",
        stopwatch.ElapsedMilliseconds / 1000.0);

//código omitido
}

Rodamos a aplicação com a tecla "F5" para receber a informação do tempo de execução das duas tarefas em torno de 3 segundos.

Agora podemos realizar a medição do processamento em paralelo. Mas antes, precisamos zerar o cronômetro para executar a ação novamente com o método Reset() e reiniciá-lo com Restart(). Por fim, paramos a medição com Stop() e exibimos o tempo decorrido.

static void Main(string[] args)
{
    //TAREFA 1: Cozinhar e refogar EM SÉRIE
    //TAREFA 2: Cozinhar e refogar EM PARALELO
    //TAREFA 3: Medir o tempo dos 2 procedimentos

    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();
    CozinharMacarrao();
    RefogarMolho();
    stopwatch.Stop();
    Console.WriteLine("Tempo decorrido: {0} segundos",
        stopwatch.ElapsedMilliseconds / 1000.0);

    stopwatch.Reset();
    stopwatch.Restart();
    Parallel.Invoke(() => CozinharMacarrao(),
        () => RefogarMolho());
    stopwatch.Stop();
    Console.WriteLine("Tempo decorrido: {0} segundos",
        stopwatch.ElapsedMilliseconds / 1000.0)"

//código omitido
}

Rodando novamente, vemos que o tempo baixa para cerca de 2 segundos, comprovando a melhoria no desempenho e aproximação de uma situação real onde as tarefas acontecem simultaneamente, como se o processador fosse o próprio cozinheiro.

Sobre o curso Certificação C# Programming parte 11: Multithreading

O curso Certificação C# Programming parte 11: Multithreading possui 336 minutos de vídeos, em um total de 57 atividades. Gostou? Conheça nossos outros cursos de .NET em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda .NET acessando integralmente esse e outros cursos, comece hoje!

  • 1247 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

Premium

  • 1247 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$75
à vista R$900
Matricule-se

Premium Plus

  • 1247 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$100
à vista R$1.200
Matricule-se

Max

  • 1247 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$120
à vista R$1.440
Matricule-se
Conheça os Planos para Empresas

Acesso por 1 ano

Estude 24h/dia onde e quando quiser

Novos cursos todas as semanas