Timeout e Retries em C#: Resiliência com async/await
Awaiters Personalizados em C#: Controle Avançado de Async
Criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. Awaiters personalizados pode ser uma maneira poderosa de controlar o fluxo de código assíncrono
Refatorando Código Síncrono para Assíncrono: Guia Passo a PassoDescubra como transformar código síncrono em assíncrono em C# com práticas detalhadas, garantindo performance e escalabilidade em suas aplicações. em situações mais específicas. Geralmente, usamos o
Task
eDiferenças entre Threads, Tasks e Delegates em C#Aprenda as diferenças entre Threads, Tasks e Delegates em C#. Este tutorial prático ensina como otimizar a execução paralela e melhorar o desempenho.
📊 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. seu awaiter padrão para orquestrar nossas operações assíncronas
Repositório Assíncrono: Como Estruturar o Acesso a DadosDescubra como implementar um repositório assíncrono em C# seguindo boas práticas de separação de responsabilidades e eficiência de dados., mas existem casos em que precisamos de um comportamento mais sob medida, seja para otimizar a checagem de status, seja para manipular eventos externos antes de considerar a tarefa
🤝 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. concluída.
Neste tutorial, exploraremos:
- O que são Awaiters.
- Por que criar
📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. implementações personalizadas.
- Os métodos e propriedades
⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção. fundamentais que um Awaiter precisa ter.
- Um exemplo passo a passo de como criar
📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. e usar um Awaiter que atenda demandas especiais.
Visão Geral sobre Awaiters🔗
O Awaiter é o componente que entra em ação quando📊 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. usamos o operador
await
em um objeto. Ele define como o compilador deve verificar o término de uma tarefa e como o código deve prosseguir assim que a tarefa⚡ 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.
🤝 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. estiver concluída. Em nível avançado, o compilador C# traduz
await
para chamadas a métodos e propriedades⚡ 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. objeto
⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção. de um Awaiter, como
GetAwaiter()
, IsCompleted
, OnCompleted(...)
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.
GetResult()
.
Ao criarmos Awaiters personalizados, normalmente precisamos implementar a interface📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!Descubra como as interfaces em C# funcionam como contratos que garantem implementações flexíveis e robustas, facilitando o design e testes de sistemas. INotifyCompletion, ou, em alguns casos, ICriticalNotifyCompletion, dependendo do nível de controle que queremos exercer na retomada do fluxo.
Por que Criar Awaiters Personalizados?🔗
Nem sempre as operações assíncronasRepositório Assíncrono: Como Estruturar o Acesso a DadosDescubra como implementar um repositório assíncrono em C# seguindo boas práticas de separação de responsabilidades e eficiência de dados. que desenvolvemos se encaixam perfeitamente no padrão
Task
/Diferenças entre Threads, Tasks e Delegates em C#Aprenda as diferenças entre Threads, Tasks e Delegates em C#. Este tutorial prático ensina como otimizar a execução paralela e melhorar o desempenho.
ValueTask
. Algumas situações em que um Awaiter customizado é útil:
- Interação com hardware ou dispositivos externos: verificar diretamente se um dispositivo completou determinada operação antes de retomar o fluxo do método
🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência..
- Eventos de biblioteca
🎮 Projeto: Sistema de Gerenciamento de Biblioteca com OOP Puro!Descubra como desenvolver um sistema de biblioteca eficiente utilizando conceitos de Orientação a Objetos em C#. Mergulhe neste tutorial prático e desafiador! de baixo nível: se sua aplicação precisa reagir a eventos internos de API
🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real. nativa, você pode encapsular a lógica de “aguardo” em um Awaiter.
- Fluxo de processamento de dados: aplicar checagens especiais ou condicionar a conclusão não apenas ao término da tarefa
🤝 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., mas também a algum estado adicional do sistema.
Métodos e Propriedades Fundamentais🔗
Um Awaiter padrão em C# deve prover ao menos:
Método/Propriedade | Descrição |
---|---|
IsCompleted | Propriedade que indica se a operação já foi concluída. |
GetResult() | Método que retorna o resultado da operação (caso haja um retorno). Se não houver retorno, pode ser void . |
OnCompleted(Action) | Método que recebe uma ação a ser executada quando a operação assíncrona estiver concluída. |
- IsCompleted: Usado 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! otimizar o fluxo do compilador - se estiver
true
, o código não precisa agendar a continuação em um retorno posterior. - GetResult(): Invocado quando
📊 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. o Awaiter determina que a tarefa
🤝 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. foi concluída, retornando o resultado correspondente (ou nada, se for
void
). - OnCompleted(Action): É aqui que a continuação (o restante do método assíncrono
Como Funciona o Operador 'await' e o que Significa 'async' nos MétodosAprenda a usar async e await em C# para processar tarefas demoradas sem bloquear sua aplicação. Torne o código legível e eficiente, melhorando a performance.) é registrada para ser executada assim que a operação estiver concluída.
Passo a Passo: Criando um Awaiter Personalizado🔗
Vamos criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. um pequeno Awaiter que simula a espera
Criando seu Primeiro Programa Assíncrono: do Zero ao DeployAprenda a configurar seu ambiente, criar e executar um projeto assíncrono em C# com async/await e prepare o deploy da sua aplicação com segurança. por um intervalo de tempo, porém de forma totalmente customizada. Isso é apenas um exemplo didático para ilustrar os pontos centrais da implementação.
Definindo a Classe de Espera
Vamos começar definindo uma classe🏗️ 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. que representará nossa operação de espera simulada:
using System;
using System.Runtime.CompilerServices;
using System.Threading;
public class CustomDelay
{
private readonly int _milliseconds;
public CustomDelay(int milliseconds)
{
_milliseconds = milliseconds;
}
// Método essencial para o uso com 'await'
public CustomDelayAwaiter GetAwaiter()
{
return new CustomDelayAwaiter(_milliseconds);
}
}
- Construtor
🔑 Construtores: Inicialize Objetos como um Arquiteto de OOP!Descubra como os construtores em C# estruturam objetos, garantindo inicialização segura e promovendo boas práticas de desenvolvimento orientado a objetos.: recebe o tempo em milissegundos que queremos simular de atraso.
- GetAwaiter(): retorna nossa estrutura (ou classe
🏗️ 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.) que implementará a lógica de “aguardo”.
Implementando o Awaiter
Agora, precisamos criar a classe🏗️ 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./estrutura que efetivamente implementa os métodos e propriedades
⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção. esperados pelo compilador:
public struct CustomDelayAwaiter : INotifyCompletion
{
private readonly int _milliseconds;
private Timer _timer;
public bool IsCompleted { get; private set; }
public CustomDelayAwaiter(int milliseconds)
{
_milliseconds = milliseconds;
_timer = null;
IsCompleted = false;
}
public void OnCompleted(Action continuation)
{
// Inicializa um timer que, ao expirar, marca IsCompleted como true e chama a continuação.
_timer = new Timer(_ =>
{
IsCompleted = true;
_timer.Dispose();
_timer = null;
continuation();
}, null, _milliseconds, Timeout.Infinite);
}
public void GetResult()
{
// Caso fosse necessário retornar algum valor, faríamos aqui.
// O compilador chamará este método depois de IsCompleted == true.
}
}
- IsCompleted: inicia como
false
. Após o timer expirar, definimos comotrue
. - OnCompleted(Action): registra a ação de continuação (o resto do método assíncrono
Como Funciona o Operador 'await' e o que Significa 'async' nos MétodosAprenda a usar async e await em C# para processar tarefas demoradas sem bloquear sua aplicação. Torne o código legível e eficiente, melhorando a performance.). Quando o timer expira, chamamos
continuation()
. - GetResult(): se precisássemos retornar dados, este seria o local adequado. Aqui, apenas estamos demonstrando um atraso, então
📊 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. não retornamos nada.
Usando o Awaiter
Podemos agora criar um método assíncronoComo Funciona o Operador 'await' e o que Significa 'async' nos MétodosAprenda a usar async e await em C# para processar tarefas demoradas sem bloquear sua aplicação. Torne o código legível e eficiente, melhorando a performance. para ilustrar o comportamento:
public static async Task TestCustomDelay()
{
Console.WriteLine("Iniciando teste do CustomDelay...");
// Aguarda nosso atraso personalizado de 2 segundos
await new CustomDelay(2000);
Console.WriteLine("Concluído atraso personalizado.");
}
- Quando
📊 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. o compilador encontra
await
, ele chamará⚡ 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. new CustomDelay(2000)
GetAwaiter()
, que retornaCustomDelayAwaiter
. - Em seguida, verificará
IsCompleted
. Se for🔄 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!
false
, chamaráOnCompleted(Action)
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! se inscrever na continuação.
- Assim que a continuação é acionada pelo timer, o compilador volta 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. chama
GetResult()
, finalizando oawait
.⚡ 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.
Considerações Importantes🔗
- Uso de Estrutura vs. Classe
🏗️ 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.: Podemos implementar o Awaiter tanto como classe
🏗️ 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. quanto como struct
🏗️ 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.. O struct
🏗️ 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. ajuda a evitar alocações
📉 Alocações Zero: Escreva Código Sem Gerar Lixo!Aprenda a evitar alocações desnecessárias em C# aplicando técnicas com structs, stackalloc, Span<T> e pooling para uma performance ideal. extras.
- Sincronização e Encapsulamento
🔒 Encapsulamento: Proteja Seus Dados como um Banco Suíço!Aprenda a proteger seus dados com encapsulamento em C#: técnicas e melhores práticas para um código seguro, modular e eficiente.: Se for realizar leituras/escritas em recursos
📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. compartilhados, considere usar mecanismos de thread
Diferenças entre Threads, Tasks e Delegates em C#Aprenda as diferenças entre Threads, Tasks e Delegates em C#. Este tutorial prático ensina como otimizar a execução paralela e melhorar o desempenho.-safety 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 problemas de concorrência.
- Descarte de Recursos
📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos.: Assim como fizemos com
Timer.Dispose()
, lembre de liberar recursos📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. externos ao completar sua operação.
- Extensibilidade: Você pode adicionar mais campos e propriedades
⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção. para acompanhar o estado da operação, logs ou métricas de monitoração enquanto espera.
Conclusão🔗
Awaiters personalizados oferecem uma forma de aprofundar 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. ajustar o comportamento do
async/await
às particularidades do seu contexto. Embora o uso mais frequente ainda seja com ⚡ 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.
Task
e APIs de alto nível, entender como criarDiferenças entre Threads, Tasks e Delegates em C#Aprenda as diferenças entre Threads, Tasks e Delegates em C#. Este tutorial prático ensina como otimizar a execução paralela e melhorar o desempenho.
📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. e ajustar Awaiters sob medida pode trazer benefícios em cenários
📊 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. onde o controle minucioso sobre a finalização de uma operação é fundamental.
Com a abordagem descrita, você tem o passo a passo essencial 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!:
1. Entender o fluxo “padrão” que o compilador esperaCriando seu Primeiro Programa Assíncrono: do Zero ao DeployAprenda a configurar seu ambiente, criar e executar um projeto assíncrono em C# com async/await e prepare o deploy da sua aplicação com segurança..
2. Implementar as interfaces📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!Descubra como as interfaces em C# funcionam como contratos que garantem implementações flexíveis e robustas, facilitando o design e testes de sistemas. necessárias (INotifyCompletion).
3. Personalizar a maneira como você sinaliza ao compilador que a operação terminou (via IsCompleted
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.
OnCompleted(Action)
).
A partir daqui, você poderá criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. soluções mais elaboradas, sempre adequando o Awaiter às suas necessidades específicas.
Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.
Referências🔗
- Documentação oficial do .NET sobre programação assíncrona: learn.microsoft.com/pt-br/dotnet/csharp/programming-guide/concepts/async