Programação Assíncrona C#: Task vs ValueTask Desmistificado
Domine Crawling Assíncrono em C#: Otimize Seu SEO Já!
Crawlers web são robôs digitais que vasculham a internet coletando dados, como o Google faz para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! indexar páginas. Neste artigo, vamos criar um crawler assíncrono
⚡ Async/Await: Programação Assíncrona sem Callbacks!Aprenda a aplicar Async/Await em C# para criar aplicações responsivas, evitar travamentos e melhorar a escalabilidade com exemplos práticos e dicas essenciais. em C# capaz de processar múltiplas páginas simultaneamente. Ideal para quem quer dominar programação assíncrona
⚡ Async/Await: Programação Assíncrona sem Callbacks!Aprenda a aplicar Async/Await em C# para criar aplicações responsivas, evitar travamentos e melhorar a escalabilidade com exemplos práticos e dicas essenciais. e aplicações de alto desempenho!
Índice🔗
- Por que um Crawler Assíncrono
⚡ Async/Await: Programação Assíncrona sem Callbacks!Aprenda a aplicar Async/Await em C# para criar aplicações responsivas, evitar travamentos e melhorar a escalabilidade com exemplos práticos e dicas essenciais.? - Conceitos Fundamentais
- Desenvolvendo o Crawler Passo a Passo
- Desafios e
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. Soluções Comuns - Código Completo do Crawler
- Expandindo o Projeto
🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes.
Por que um Crawler Assíncrono?🔗
| Síncrono vs Assíncrono | Desempenho |
|---|---|
| Processamento sequencial | 10 páginas em 10 segundos |
| Processamento paralelo | 50 páginas em 10 segundos |
Problema
🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes. Real: A maioria dos sites tem latência (atraso) de 500ms-2s para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! carregar. Um crawler síncrono ficaria ocioso 99% do tempo esperando respostas!
Conceitos Fundamentais🔗
async/await
public async Task<string> DownloadPageAsync(string url)
{
using HttpClient client = new();
return await client.GetStringAsync(url);
}
Funcionamento: Libera a thread enquanto
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! espera I/O (como download), permitindo que o processador execute outras tarefas.
HttpClient
- Pool de Conexões
Gerenciamento Inteligente de Conexões para Consultas EscaláveisAprenda a gerenciar conexões em consultas LINQ de forma inteligente, garantindo alta performance e escalabilidade na comunicação com bancos de dados.: Reutiliza conexões TCP - Timeout
Timeout e Retries: Estratégias de Resiliência com Async/AwaitAprenda a usar Timeout e Retries com async/await em C# para garantir operações assíncronas robustas e melhorar a resiliência da sua aplicação.: Configurável para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! evitar esperas infinitas - Headers: Simula navegadores reais
Concorrência Controlada
SemaphoreSlim throttler = new SemaphoreSlim(10); // Limite de 10 requests simultâneos
await throttler.WaitAsync();
try {
// Processa página
} finally {
throttler.Release();
}
Desenvolvendo o Crawler Passo a Passo🔗
Configuração do Projeto
dotnet new console -n WebCrawler
cd WebCrawler
dotnet add package HtmlAgilityPack # Para parsear HTML
Classe Base do Crawler
public class AsyncCrawler
{
private readonly HttpClient _client;
private readonly SemaphoreSlim _semaphore;
public AsyncCrawler(int maxConcurrency = 10)
{
_client = new HttpClient();
_semaphore = new SemaphoreSlim(maxConcurrency);
}
}
Método Assíncrono Principal
public async Task CrawlAsync(string startUrl)
{
var html = await DownloadPageAsync(startUrl);
var links = ParseLinks(html);
var tasks = links.Select(ProcessLinkAsync);
await Task.WhenAll(tasks);
}
Parsing de HTML
private List<string> ParseLinks(string html)
{
var doc = new HtmlDocument();
doc.LoadHtml(html);
return doc.DocumentNode
.SelectNodes("//a[@href]")
.Select(a => a.GetAttributeValue("href", ""))
.Where(link => Uri.IsWellFormedUriString(link, UriKind.Absolute))
.ToList();
}
Gerenciamento de URLs
private ConcurrentDictionary<string, bool> _visitedUrls = new();
private async Task ProcessLinkAsync(string url)
{
if (_visitedUrls.TryAdd(url, true)) // Evita duplicatas
{
await _semaphore.WaitAsync();
try {
var content = await _client.GetStringAsync(url);
// Processa conteúdo...
} finally {
_semaphore.Release();
}
}
}
Desafios e Soluções Comuns🔗
Rate Limiting
// Adiciona delay entre requests
await Task.Delay(TimeSpan.FromSeconds(1));
Tratamento de Erros
try {
// Código do crawler
} catch (HttpRequestException ex) when (ex.StatusCode == HttpStatusCode.NotFound) {
// Página não existe
} catch (Exception ex) {
// Log de erros
}
Otimização de Performance
// Habilita compressão
_client.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate");
Código Completo do Crawler🔗
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using HtmlAgilityPack;
namespace AsyncWebCrawler
{
public class Program
{
private static readonly HttpClient _httpClient = new HttpClient();
public static async Task Main()
{
var urls = new string[]
{
"https://exemplo.com",
"https://outrosite.com"
};
var tasks = new List<Task>();
foreach (var url in urls)
{
tasks.Add(ProcessUrlAsync(url));
}
// Aguarda todas as tarefas (processamentos) terminarem
await Task.WhenAll(tasks);
Console.WriteLine("Crawler finalizado!");
}
private static async Task ProcessUrlAsync(string url)
{
try
{
string content = await _httpClient.GetStringAsync(url);
if (!string.IsNullOrEmpty(content))
{
var doc = new HtmlDocument();
doc.LoadHtml(content);
// Exemplo: Selecionar título da página
var titleNode = doc.DocumentNode.SelectSingleNode("//title");
if (titleNode != null)
{
Console.WriteLine($"Título da página em {url} => {titleNode.InnerText}");
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Erro no processamento de {url}: {ex.Message}");
}
}
}
}
Expandindo o Projeto🔗
1. Armazenamento de Dados
await File.WriteAllTextAsync($"pages/{Guid.NewGuid()}.html", content);
Parallel.ForEach(links, new ParallelOptions { MaxDegreeOfParallelism = 4 },
link => ProcessLinkAsync(link).Wait());
var policy = Policy
.Handle<HttpRequestException>()
.WaitAndRetryAsync(3, retryAttempt =>
TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
Conclusão🔗
Dominar crawlers assíncronos abre portas para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais!:
- Sistemas de monitoramento
🚀 Kubernetes: Orquestração de Microservices na Nuvem!Descubra como Kubernetes revoluciona o gerenciamento de microsserviços na nuvem, garantindo escalabilidade, automação e alta disponibilidade. de preços - Agregadores de conteúdo
- Ferramentas de SEO
- Análise de dados em larga escala
Criando e Escalando Serviços no Docker SwarmDescubra como criar, gerenciar e escalar serviços no Docker Swarm, utilizando comandos simples para manter alta disponibilidade em seu cluster.
Experimente modificar o código para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! extrair dados específicos (como preços ou notícias) e veja seu crawler ganhar vida!
FAQ:
Q: Qual a diferença entre async e multithreading?
R: Async libera threads durante I/O, enquanto multithreading usa múltiplas CPUs. Podem ser combinados!
Q: Como evitar ser bloqueado por sites?
R: Respeite robots.txt, use delays e rotacione User-Agents.
Boas Práticas e Próximos Passos🔗
- Respeite o site: Não envie requisições em excesso, nem tente burlar restrições sem autorização
🛡️ Segurança em SignalR: Autenticação e Autorização!Descubra como implementar JWT e autorização com roles e claims no SignalR, garantindo segurança e controle de acessos em tempo real.. - Use _caching_: Se precisar baixar a mesma página várias vezes, verifique se algo mudou antes de baixar novamente.
- Organize melhor: Separe responsabilidades em classes
🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara., como Downloader,Parser,Storage, etc. - Exploração: Também vale a pena explorar bibliotecas ou frameworks de crawling existentes que facilitam o trabalho e ajudam a gerenciar filas de URLs e limitações de taxa (rate limiting
🔒 Rate Limiting Avançado: Proteja APIs contra Abusos!Descubra como implementar rate limiting avançado em .NET 8+ para proteger suas APIs, otimizar desempenho e evitar a sobrecarga do servidor.).
Depois de dominar esse conceito, dá para aprimorar o uso de _async/await_, monitorar desempenho com logs, ou até mesmo integrar com banco de dados
Conceitos fundamentais de NoSQL: bases para trabalhar com MongoDB em C#Descubra os fundamentos do NoSQL e aprenda como utilizar MongoDB com C# para desenvolver aplicações .NET escaláveis e modernas até 2025. para armazenar o que foi coletado. O campo de aplicação é enorme!
Boa exploração nos seus projetos
🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!Aprenda a otimizar seu perfil LinkedIn com dicas essenciais para devs .NET. Conquiste oportunidades e destaque suas habilidades! de Web Crawler!
Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.
Referências🔗
- .NET Documentation: learn.microsoft.com/pt-br/dotnet/
- Awesome .NET: github.com/quozd/awesome-dotnet
- C# Language Specification: learn.microsoft.com/pt-br/dotnet/csharp/language-reference/language-specification/
- GitHub: Microsoft/.NET: github.com/dotnet
- Microsoft Learn: C# e .NET: learn.microsoft.com/pt-br/dotnet/csharp/

há 10 months atrás
há 11 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás
há 11 months atrás
há 11 months atrás
há 11 months atrás
há 11 months atrás
há 11 months atrás
há 11 months atrás
há 11 months atrás
há 11 months atrás
há 11 months atrás
há 11 months atrás
há 11 months atrás
há 11 months atrás
há 11 months atrás
há 11 months atrás
há 11 months atrás
há 11 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás