Leitura

Diferentes formas de trabalhar com paralelismo no C#: threads, Parallel For e Parallel LINQ

Criado em 27/12/2022

O paralelismo é uma técnica que permite que você divida uma tarefa em várias partes e execute essas partes ao mesmo tempo, aproveitando ao máximo o poder de processamento do seu computador. Isso pode ser útil quando você precisa realizar uma tarefa que leva muito tempo, como processar uma grande quantidade de dados ou executar uma simulação complexa.

No C#, existem várias formas de se trabalhar com paralelismo, dependendo da sua necessidade. Algumas dessas formas são:

Threads

As threads são um recurso do sistema operacional que permitem que você execute uma tarefa em paralelo com outras tarefas. No C#, você pode criar threads usando a classe Thread ou a classe Task. Por exemplo:

                                    
using System.Threading;

Thread thread = new Thread(() => {
    // Aqui vai o código da thread
});
thread.Start();

// Ou

Task.Run(() => {
    // Aqui vai o código da task
});
                                    
                                

Parallel For:

O Parallel For é uma estrutura de loop que permite que você execute um loop de forma paralela ou seja, em múltiplas threads ao mesmo tempo. Você pode usar o Parallel For usando o método Parallel.Forou a classe ParallelLoopResult. Isso pode ser útil quando você precisa realizar uma tarefa em uma grande quantidade de elementos e quer aproveitar ao máximo o poder de processamento do seu computador. Por exemplo:

Para usar o Parallel ForEach, basta chamar o métodoParallel.ForEach e passar como parâmetros uma coleção de elementos e uma ação a ser executada em cada elemento. Por exemplo:

                                    
List numbers = new List { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

Parallel.ForEach(numbers, (number) => {
    Console.WriteLine($"Processing number {number}");
});
                                    
                                

Esse código irá imprimir a mensagem "Processing number X" para cada número da lista, mas a ordem em que as mensagens são impressas pode ser diferente da ordem original da lista, pois cada iteração do loop é executada em uma thread diferente.

Além disso, o Parallel ForEach também permite que você especifique opções de execução, como o número máximo de threads a serem utilizadas ou o modo de paralelismo a ser utilizado. Por exemplo:

                                    
ParallelOptions options = new ParallelOptions { MaxDegreeOfParallelism = 4 };

Parallel.ForEach(numbers, options, (number) => {
    Console.WriteLine($"Processing number {number}");
});

                                    
                                

Nesse exemplo, o Parallel ForEach irá utilizar no máximo 4 threads para executar o loop, o que pode ser útil em casos em que você não quer sobrecarregar o sistema com muitas threads.

Em resumo, o Parallel ForEach é uma ferramenta muito útil para acelerar o processamento de tarefas em grandes coleções de dados, mas é importante levar em consideração que o uso excessivo de threads pode sobrecarregar o sistema e até mesmo diminuir o desempenho em alguns casos. Por isso, é sempre importante medir o impacto do uso doParallel ForEach em seu código e, se necessário, ajustar as opções de execução para obter o melhor resultado possível.

Parallel LINQ (PLINQ)

O Parallel LINQ é um conjunto de operadores que permite que você execute consultas LINQ de forma paralela. Você pode usar o Parallel LINQ usando o métodoAsParallel e os operadores WithDegreeOfParallelism eWithExecutionMode. Por exemplo:

                                    
using System.Linq;

var result = from n in Enumerable.Range(0, 10)
                        .AsParallel()
                        .WithDegreeOfParallelism(2)
                        .WithExecutionMode
                            (ParallelExecutionMode.ForceParallelism) select n;
                                    
                                

Em resumo, o paralelismo é uma técnica poderosa para acelerar o processamento de tarefas que levam muito tempo, mas é importante levar em consideração que o uso excessivo de threads pode sobrecarregar o sistema e até mesmo diminuir o desempenho em alguns casos, por isso avalie bem o cenário e utilize as ferramentas de diagnóstico da própria IDE para identificar as métricas e verificar se a alteração está sendo eficiente ou não, em breve vou escrever um artigo sobre essas ferramentas, até breve! :)

Leitura

Recentemente no Blog

Thumbnail for Hospedando site estático (Parte: 1)
Nov 18, 2023 | WEB | 0

Hospedando site estático (Parte: 1)

Hospedando site estático com custo zero utilizando Cloudflare e Amazon S3.

Thumbnail for Manipulando arquivos JSON com performance
Out 29, 2023 | .NET | 0

Manipulando arquivos JSON com performance

Aprenda em poucos passos a ler/escrever arquivo JSON de forma simples.

Thumbnail for Diferentes formas de trabalhar com paralelismo no C#: threads, Parallel For e Parallel LINQ
Dez 27, 2022 | .Net | 0

Diferentes formas de trabalhar com paralelismo no C#: threads, Parallel For e Parallel LINQ

Aqui ensino uma técnica muito boa para aumentar significativamente performance de aplicações

Thumbnail for Minha história
Dez 25, 2022 | Carreira | 0

Minha história

Toda história da minha carreira do início até a atualidade e também falo um pouco sobre a minha visão do futuro.

Thumbnail for (Em breve) Servidor gratuito na AWS (VPS)
Out 29, 2023 | AWS | 0

(Em breve) Servidor gratuito na AWS (VPS)

Hospede de graça as suas aplicações, descubra aqui como é simples.

Sobre

Quem sou eu?

Olá, eu sou Anderson Silva sou um programador com mais de 7 anos de experiência na área de T.I. Comecei minha carreira como técnico de informática em 2016 que foi a fase em que aprimorei habilidades técnicas e atendimento ao usuário final. Em 2019, decidi me especializar em programação, desde então tenho trabalhado em projetos de diversos tamanhos e complexidades.

Tenho habilidades sólidas em linguagens backend como C#, Node e gosto de trabalhar em projetos desafiadores, tenho a honra de ter participado de um dos projetos vencedores do Fapemig 2021 que foi a construção de um chatbot criado para atuar na área da saúde. Estou sempre em busca de aprendizado e crescimento profissional.

Inovação

Pesquisa

Desenvolvimento

Aplicação

Te convido a fazer parte das minhas redes sociais,
será um prazer trocar conhecimentos com você!

Habilidades

Minhas habilidades

Estou listando aqui algumas das habilidades que adquiri ao longo do tempo e que uso no dia-dia, o percentual representa o quanto tenho contato com essas tecnologias diariamente

.Net C#

Avançado

Javascript

Avançado

HTML5

Intermediário

CSS3

Intermediário

SQL

Intermediário

AWS

Médio

Git

Intermediário

React

Básico

Angular

Básico

Node

Médio
Copos de café
Anos de Experiência em T.I
Educação

Educação

Durante minha pós-graduação em Análise de Machine Learning, aprendi sobre vários tópicos importantes que me abriram a mente de como funciona esse mundo incrível da inteligência artificial.

Um dos tópicos mais valiosos que aprendi foi sobre técnicas de machine learning, como regressão, classificação e agrupamento. Aprendi como aplicar cada uma dessas técnicas em conjunto com diferentes algoritmos de machine learning, como o algoritmo K-Means e o algoritmo de regressão linear.

Também aprendi sobre a preparação de dados, que é uma etapa crucial na análise de machine learning. Aprendi sobre técnicas de pré-processamento de dados, como normalização e padronização, e sobre como lidar com dados ausentes ou incorretos.

Outro tópico importante que estudei foi sobre avaliação de modelos de machine learning. Aprendi sobre diferentes métricas de avaliação, como acurácia e f1-score, e como escolher a métrica adequada para cada problema de machine learning.

Esses são apenas alguns dos tópicos que aprendi durante minha pós-graduação em análise de machine learning e que sempre levo em consideração quando estou lidando com uma aplicação ou projeto que envolve inteligência artificial.

Durante minha graduação em Análise e Desenvolvimento de Sistemas, aprendi sobre vários tópicos importantes que me prepararam para a carreira de desenvolvedor de software.

Aprendi sobre padrões de projeto, que são soluções bem estabelecidas para problemas comuns encontrados durante o desenvolvimento de software. Isso me ajudou a escrever código mais limpo e organizado e a criar aplicações de software de maneira mais eficiente.

Outro tópico importante que estudei foi sobre metodologias de desenvolvimento de software, como ágil e cascata. Aprendi sobre as vantagens e desvantagens de cada uma dessas abordagens e como escolher a melhor para cada projeto de software.

Esses são apenas alguns dos tópicos que aprendi durante minha graduação em desenvolvimento de sistemas. Venho aplicacando esses conhecimentos em minha carreira de desenvolvedor de software e continuo aprendendo e crescendo na indústria.

Durante minha formação Técnica em Informática, aprendi sobre vários tópicos importantes que me prepararam para a carreira de técnico de informática.

Um dos tópicos mais valiosos que aprendi foi sobre programação, foi lógica de programação, estruturas de dados e algoritmos, o que me ajudou a escrever código eficiente e bem estruturado. Assim como também criei aplicações acadêmicas utilizando Java (mobile, deskop e web), html, css e javascript.

Também aprendi sobre redes, incluindo como configurar e gerenciar redes de computadores. Aprendi sobre protocolos de rede, como TCP/IP e HTTP, e sobre como garantir a segurança de uma rede.

Outro tópico importante que estudei foi sobre sistemas operacionais, como Windows e Linux. Aprendi sobre como instalar e configurar sistemas operacionais, bem como sobre como gerenciar arquivos e pastas e resolver problemas comuns.

Além disso, aprendi um pouco sobre hardware, incluindo como montar e desmontar computadores e como instalar e configurar periféricos. Também aprendi sobre segurança da informação, incluindo como proteger um sistema de computador de ameaças externas.

Esses são apenas alguns dos tópicos que aprendi durante minha formação técnica em informática no qual tive uma base de conhecimento para iniciar a aprendizagem da programação e que fez total diferença em minha evolução.

Decidi fazer cursos profissionalizantes em programação, segurança da informação, machine learning e assim como também participar de eventos para aperfeiçoar minhas habilidades e ampliar meus conhecimentos na área.

Cada curso me proporcionou uma visão mais aprofundada dessas áreas e me deu a oportunidade de praticar e aplicar o que aprendi em projetos reais. Além disso, esses cursos me permitiram conhecer profissionais experientes e aprender com eles.

A seguir, estão os cursos profissionalizantes que completei:

  • (Alura) Angular Parte 3: Upload, Build e Novos Componentes - Fev/2022
  • (Alura) Angular Parte 2: Autenticação, Forms e Lazy Loading - Fev/2022
  • (IGTI) Evento Dev Summit Speed - Fev/2022
  • (Alura) Python Scikit-learn: Regressão, Classificação e Clustering - Nov/2021
  • (Alura) Angular Parte 1: Upload, Build e Novos Componentes - Out/2021
  • (Alura) Clustering Básico: K-means, Dbscan e Mean Shift - Out/2021
  • (Alura) Machine Learning: Intro a Sistemas de Recomendação Em Python - Out/2021
  • (Alura) Machine Learning: Introdução a classificação com SKLearn - Out/2021
  • (Alura) Solid Com Java: Princípios da Programação Orientada a Objetos - Out/2021
  • (Grasshopers) Fundamentos de Codificação - Jun/2021
  • (Lucas Caton) Desenvolvimento Web Direto ao Ponto - Dez/2020
  • (IGTI) Bootcamp Desenvolvedor Fullstack - Aug/2020
  • (Roadsec) Evento de segurança da informação em São Paulo - Nov/2019
  • (Udemy Academy) Bootstrap 4: Completo e Direto ao Ponto - Jul/2019
  • (Roadsec) Evento de segurança da informação em Belo Horizonte - Jun/2019
  • (Fireshell Security Team) Introdução Ao Mundo de Capture The Flag (CTF) - Mar/2019
  • Hacker Ético Profissional - Nível 2 - Nov/2018
  • Hacker Ético Profissional - Nível 1 - Jan/2018
Experiências

Experiência Profissional

Desenvolvedor Full Stack Pleno III na BTGMaio 2022 - Atual

Alocado pela DQR Tech em projeto financeiro no maior banco de investimento na américa latina, realizando manutenções no sistema e desenvolvendo novas features utilizando .NET 5 C#, React, Amazon DynamoDB, AWS Lambda, Microsoft SQL Server, teste unitários, princípios SOLID, design patterns, controle de versão com Azure Devops e metodologia ágil usando o Kanban.

Analista de Sistemas no Grupo Santa Casa BHNov 2020- Out 2021

Analisar e desenvolver projetos de sistemas, levantar requisitos, mapear processos e realizar modelagem de dados com o objetivo de estudar e implementar sistemas de acordo com as regras de negócio. Analisar o desempenho de sistemas implantados, solucionar problemas técnicos, dar suporte ao usuário final, elaborar documentações.

Desenvolvedor de Sistemas no Grupo Santa Casa BHAbr 2019- Nov 2020

Programação fullstack utilizando as tecnologias .net (core, framework, c#), node, oracle realizando manutenção de sistemas, melhorias e também auxiliando com a criação e implementação de novos sistemas.

Técnico de suporte na CW4 Soluções Jun 2018 - Dez 2018

Suporte nas principais ferramentas e produtos relacionados às soluções da segurança da informação em ambiente corporativo.

Técnico de informática no Grupo Santa Casa BHJun 2016 - Out 2018

Responsável por manter a integridade e o correto funcionamento dos principais sistemas utilizados pelo grupo, auxiliar usuários via acesso remoto e atendimento local, manutenção de computadores e impressoras, avaliar problemas e encaminhá-los para o devido suporte quando necessário. Auxilio na gestão da equipe e tomada de decisões.

Entre em contato

Contato

Belo Horizonte, Minas Gerais