Timeout e Retries em C#: Resiliência com async/await

A execução de tarefasDiferenças entre Threads, Tasks e Delegates em C#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. de forma assíncrona⚡ Async/Await: Programação Assíncrona sem Callbacks!⚡ 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. é capaz de tornar nossas aplicações mais responsivas e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 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. robustas. Entretanto, muitas vezes precisamos lidar com _operações que podem demorar tempo demais_ ou falhar momentaneamente. É nesse cenário que entram as estratégias de Timeout e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 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. Retries para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 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! tornar o fluxo resistente a falhas transitórias e prolongadas.

Neste tutorial, vamos explorar de maneira narrativa como aplicar essas estratégias em código C# usando o padrão async/await⚡ Async/Await: Programação Assíncrona sem Callbacks!⚡ 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.. Você verá exemplos de uso🔏 Criptografia Assimétrica: Domine RSA e Troca de Chaves!🔏 Criptografia Assimétrica: Domine RSA e Troca de Chaves!Descubra como a criptografia assimétrica protege a troca de chaves e garante segurança em sistemas digitais usando RSA, C# e práticas recomendadas. e entenderá a importância de cada prática para garantir resiliência e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 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. confiabilidade em métodos assíncronosComo Funciona o Operador 'await' e o que Significa 'async' nos MétodosComo 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..

Motivação para Timeout e Retries🔗

Imagine uma aplicação que faz chamadas externas a um provedor de dados. Em ambientes distribuídos, atrasos na rede podem acontecer, aumentando significativamente o tempo de resposta. Se o seu método assíncronoComo Funciona o Operador 'await' e o que Significa 'async' nos MétodosComo 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. não tiver um _timeout_, pode ficar indefinidamente aguardando a conclusão. Da perspectiva do usuário, a aplicação está “travada”.

Além disso, falhas pontuais podem ocorrer, como interrupções temporárias. Nesse caso, nem sempre a solução é “desistir imediatamente” da operação. Muitas vezes, tentar novamente (RetryUtilizando Circuit Breaker e Retry de Forma AssíncronaUtilizando Circuit Breaker e Retry de Forma AssíncronaAprenda a usar Retry e Circuit Breaker em C# para chamadas assíncronas, garantindo robustez, evitando falhas e melhorando a experiência do usuário.) após um curto intervalo resolve a situação sem que o usuário perceba.

Dessa forma, Timeout e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 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. Retries formam um conjunto poderoso para evitar “engasgos” na aplicação, assegurando que as tarefas demorem o tempo certo para executar🔍 Comandos: Desacople Ações dos Botões!🔍 Comandos: Desacople Ações dos Botões!Aprenda a implementar comandos em C# para desacoplar lógica e interface usando MVVM, com exemplos práticos e dicas para melhor testabilidade e manutenção. - e que possam se beneficiar de novas tentativas, quando apropriado.

Entendendo o Conceito de Timeout🔗

Timeout é, essencialmente, um limite de tempo. Significa que se o método não terminar nessa janela de tempo, a operação deve ser cancelada e eventualmente gerar uma exceção. Em C#, a maneira mais simples de simular um timeout consiste em aguardarComo Funciona o Operador 'await' e o que Significa 'async' nos MétodosComo 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. a completação de uma tarefa🤝 GitHub Básico: Versionamento para Iniciantes!🤝 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. dentro de um tempo pré-determinado.

Cenários de Uso

Maneiras de Implementar Timeout

1. CancellationToken🎯 CancellationToken: Cancele Operações Demoradas!🎯 CancellationToken: Cancele Operações Demoradas!Descubra como aplicar CancellationToken no C# para abortar operações com eficiência, evitando travas de UI e otimizando o uso de recursos das aplicações.: criar um token com data de expiração e cancelar a operação quando📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 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. passar do tempo definido.

2. TaskDiferenças entre Threads, Tasks e Delegates em C#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..WhenAny: aguardarComo Funciona o Operador 'await' e o que Significa 'async' nos MétodosComo 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. a finalização de uma tarefa _ou_ o disparo de um timer. Caso o timer vença, consideramos a operação como expirada.

Exemplo de Implementação de Timeout com Task.WhenAny🔗

A abordagem com TaskDiferenças entre Threads, Tasks e Delegates em C#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..WhenAny é direta e não exige recursos📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 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. extras. Veja um exemplo simplificado:

public static async Task<string> ObterDadosComTimeoutAsync()
{
    // Operação que pode atrasar
    Task<string> tarefaPrincipal = SimularOperacaoDemoradaAsync();
    // Tarefa que representa o “estouro” de tempo
    Task timeout = Task.Delay(TimeSpan.FromSeconds(3));
    // Aguardando a primeira a concluir
    Task tarefaConcluida = await Task.WhenAny(tarefaPrincipal, timeout);
    if (tarefaConcluida == timeout)
    {
        throw new TimeoutException("A operação demorou mais do que o esperado.");
    }
    // Se chegou até aqui, a tarefa principal terminou primeiro
    return await tarefaPrincipal;
}
private static async Task<string> SimularOperacaoDemoradaAsync()
{
    // Simulando um atraso
    await Task.Delay(TimeSpan.FromSeconds(5));
    return "Resultado da operação";
}

O que acontece aqui?

Entendendo Retries🔗

Retries são tentativas extras de executar🔍 Comandos: Desacople Ações dos Botões!🔍 Comandos: Desacople Ações dos Botões!Aprenda a implementar comandos em C# para desacoplar lógica e interface usando MVVM, com exemplos práticos e dicas para melhor testabilidade e manutenção. uma operação que falhou. Em algumas situações, falhas podem ser transitórias: um servidor pode estar momentaneamente indisponível ou a rede pode sofrer oscilações. Assim, faz sentido repetir a operação após um pequeno intervalo, antes de desistir definitivamente.

Cuidados ao Implementar Retries

Exemplo de Retries Manual🔗

Abaixo, temos um exemplo simplificado de como implementar retries manualmente, determinando um número máximo🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. de tentativas e um intervalo “fixo” entre elas.

public static async Task<string> ObterDadosComRetryAsync(int maxTentativas, TimeSpan intervalo)
{
    int tentativaAtual = 0;
    while (true)
    {
        try
        {
            // Simular operação que pode falhar
            return await SimularOperacaoInstavelAsync();
        }
        catch (Exception ex)
        {
            tentativaAtual++;
            if (tentativaAtual >= maxTentativas)
            {
                // Todas as tentativas falharam, relança a exceção
                throw new InvalidOperationException($"Falha após {tentativaAtual} tentativas.", ex);
            }
            // Espera antes de tentar novamente
            await Task.Delay(intervalo);
        }
    }
}
private static async Task<string> SimularOperacaoInstavelAsync()
{
    // Simulando falha aleatória
    if (new Random().Next(0, 2) == 0)
    {
        throw new Exception("Falha simulada!");
    }
    await Task.Delay(100); // breve atraso para simular trabalho
    return "Sucesso na operação";
}

Neste método🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 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.:

Combinação de Timeout e Retries🔗

Muitas vezes, Timeout e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 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. RetryUtilizando Circuit Breaker e Retry de Forma AssíncronaUtilizando Circuit Breaker e Retry de Forma AssíncronaAprenda a usar Retry e Circuit Breaker em C# para chamadas assíncronas, garantindo robustez, evitando falhas e melhorando a experiência do usuário. são usados juntos: se a chamada exceder um tempo limite, podemos tentar novamente (até um número máximo🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. de vezes). Embora existam bibliotecas como Polly que facilitam esse tipo de implementação, você pode mesclar as abordagens apresentadas acima para criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 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. a sua própria estratégia.

Por exemplo:

1. Executar🔍 Comandos: Desacople Ações dos Botões!🔍 Comandos: Desacople Ações dos Botões!Aprenda a implementar comandos em C# para desacoplar lógica e interface usando MVVM, com exemplos práticos e dicas para melhor testabilidade e manutenção. a operação com Timeout.

2. Em caso de TimeoutException, executar🔍 Comandos: Desacople Ações dos Botões!🔍 Comandos: Desacople Ações dos Botões!Aprenda a implementar comandos em C# para desacoplar lógica e interface usando MVVM, com exemplos práticos e dicas para melhor testabilidade e manutenção. nova tentativa.

3. Se o número máximo🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. de Retries for atingido, desistir definitivamente e propagar a exceção💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código..

Boas Práticas🔗

Tabela Resumo🔗

EstratégiaObjetivo PrincipalVantagensDesafios
TimeoutImpedir que operações durem além do previsto- Evita bloqueios longos
- Força uma resposta clara para atrasos excessivos
- Escolher tempo limite adequado
- Identificar se a falha é realmente de tempo ou de outra natureza
RetryTentar novamente após falhas transitórias- Possibilidade de autorrecuperação
- Redução de indisponibilidade
- Definir número de tentativas e intervalos
- Risco de sobrecarregar serviços em cenários de falha persistente

Conclusão🔗

Ao adotar Timeout e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 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. Retries, você adiciona resiliência às suas aplicações assíncronas em C#. Um simples async/await⚡ Async/Await: Programação Assíncrona sem Callbacks!⚡ 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., quando📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 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. combinado com verificações de tempo limite e tentativas adicionais, protege sua aplicação contra falhas temporárias e esperas intermináveis, garantindo uma _melhor experiência_ para o usuário final.

Sempre avalie com critério quanto tempo faz sentido aguardar e quantas tentativas você deve conceder a cada operação. Ajustes estratégicos nesses dois parâmetros🎯 Sobrecarga de Métodos: Um Nome, Múltiplos Superpoderes!🎯 Sobrecarga de Métodos: Um Nome, Múltiplos Superpoderes!Aprenda sobre a técnica de sobrecarga de métodos no C# com exemplos e práticas recomendadas para melhorar a organização e legibilidade do seu código. podem fazer toda a diferença no desempenho⏱️ Testes de Performance: Garanta Velocidade Além da Funcionalidade!⏱️ Testes de Performance: Garanta Velocidade Além da Funcionalidade!Descubra como medir, diagnosticar e otimizar performance em aplicações .NET com dicas práticas e ferramentas essenciais para devs. e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 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. na confiabilidade final do seu sistema.

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados