Polly para C# (.NET): guia completo com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

O que é Polly e para que serve?

\n\n

Polly é uma biblioteca poderosa e flexível para .NET (C#, F#, VB.NET), projetada para lidar com falhas temporárias e aumentar a resiliência de aplicações. Ela implementa padrões de resiliência, como novas tentativas (Retry), disjuntor (Circuit Breaker), timeouts (Timeout), isolamento (Bulkhead Isolation) e cache (Cache).

\n\n

No mundo moderno da arquitetura de microsserviços e computação em nuvem, as aplicações interagem constantemente com recursos externos: bancos de dados, serviços web, APIs. Essas interações podem ser não confiáveis — erros de rede, indisponibilidade temporária do serviço, exceder limites de requisições. Polly permite lidar com essas situações de forma elegante, sem escrever código extenso com blocos try-catch.

\n\n

Principais cenários de uso:

\n
    \n
  • Retry (Novas tentativas): Repetir automaticamente a operação em caso de erro temporário.
  • \n
  • Circuit Breaker (Disjuntor): Interromper as tentativas de chamada se o serviço estiver gerando erros constantemente, para dar tempo de recuperação.
  • \n
  • Timeout (Tempo limite): Limitar o tempo de execução de uma operação.
  • \n
  • Bulkhead (Isolamento): Limitar o número de operações paralelas para que uma operação "ruim" não bloqueie todo o pool de threads.
  • \n
  • Cache (Cache): Armazenar em cache os resultados de operações bem-sucedidas.
  • \n
  • Fallback (Plano alternativo): Executar uma ação alternativa em caso de falha.
  • \n
\n\n

Instalação do Polly

\n\n

Polly é distribuído via NuGet — o gerenciador de pacotes para .NET. Pode ser instalado de várias maneiras:

\n\n

Via Package Manager Console (Visual Studio)

\n
Install-Package Polly
\n\n

Via .NET CLI

\n
dotnet add package Polly
\n\n

Via PackageReference (no arquivo .csproj)

\n
<PackageReference Include="Polly" Version="8.2.0" />
\n\n

Após a instalação, adicione a diretiva using ao seu código:

\n
using Polly;\nusing Polly.Retry;\nusing Polly.CircuitBreaker;\nusing Polly.Timeout;\nusing Polly.Bulkhead;\nusing Polly.Caching;\nusing Polly.Fallback;\nusing Polly.Wrap;
\n\n

Início rápido com exemplo de código

\n\n

Vamos considerar um exemplo simples: temos um método que chama uma API externa e queremos repetir a chamada 3 vezes se ocorrer uma exceção.

\n\n
using System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing Polly;\nusing Polly.Retry;\n\npublic class ApiClient\n{\n    private readonly HttpClient _httpClient;\n    private readonly AsyncRetryPolicy _retryPolicy;\n\n    public ApiClient()\n    {\n        _httpClient = new HttpClient();\n        \n        // Criando a política de novas tentativas\n        _retryPolicy = Policy\n            .Handle<HttpRequestException>() // Quais exceções tratar\n            .Or<TimeoutException>()          // Ou timeout\n            .WaitAndRetryAsync(\n                3,                           // Número de tentativas\n                retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), // Atraso exponencial\n                onRetry: (exception, timeSpan, retryCount, context) =>\n                {\n                    Console.WriteLine($"Tentativa {retryCount} falhou. Repetindo em {timeSpan.Seconds} seg. Erro: {exception.Message}");\n                }\n            );\n    }\n\n    public async Task<string> GetDataAsync(string url)\n    {\n        // Executando a requisição usando a política\n        return await _retryPolicy.ExecuteAsync(async () =>\n        {\n            var response = await _httpClient.GetAsync(url);\n            response.EnsureSuccessStatusCode();\n            return await response.Content.ReadAsStringAsync();\n        });\n    }\n}\n\n// Uso\npublic class Program\n{\n    public stat                    

Recommendations