C#异常重试:Polly实战与手动实现详解

阿澈
阿澈
发布时间:2026-10-16| 6人浏览过
原创

本文深入探讨C#中的异常重试机制,结合Polly库的高级用法与基础类的手动实现,为开发者提供从理论到实践的完整解决方案,确保应用在面对网络波动或资源不可用时具备更强的韧性。

重试策略的核心价值

在分布式系统或网络请求频繁的应用场景中,瞬态故障(如超时、连接拒绝)不可避免。重试模式(Retry Pattern)允许程序在检测到特定异常后自动重新执行操作,从而提高成功率。实际生产中,推荐使用经过充分测试的第三方库(如Polly),而了解其内部逻辑则有助于自定义复杂场景的处理。

Polly库的高级重试策略

Polly是.NET生态中最流行的弹性编程库,通过组合不同的策略可以应对各种复杂情况。以下展示如何在Windows Forms应用中集成Polly处理除零异常、异步超时及熔断保护。

第1步:配置基础重试策略

目的:针对特定异常类型(如 DivideByZeroException)执行固定次数的重试,并记录日志。

关键代码逻辑:

using Polly;

// 定义处理特定异常的并重试3次的策略
var retryPolicy = Policy
    .Handle()
    .Retry(3, (ex, count) =>
    {
        Console.WriteLine($"执行失败! 重试次数 {count}");
        Console.WriteLine($"异常来自 {ex.GetType().Name}");
    });

// 执行业务逻辑
retryPolicy.Execute(() => Compute());

第2步:配置带指数退避的异步重试

目的:对于不稳定的API调用,避免频繁重试导致雪崩,采用等待时间递增的策略。

关键代码逻辑:

using Polly.Timeout;

var policy = Policy.Handle()
   .WaitAndRetryAsync(5, retryAttempt => TimeSpan.FromSeconds(5), 
       (exception, retryCount) =>
       {
           // 可选:在此处记录错误日志
           string logInfo = "Retry attempt: " + retryCount;
       });

var result = policy.ExecuteAsync(async () => await TestAsync());

第3步:配置熔断器(Circuit Breaker)

目的:当连续失败次数超过阈值时,暂时阻断请求,防止系统过载,并在等待一段时间后尝试半开状态。

关键代码逻辑:

using Polly.CircuitBreaker;

var _circuitBreakerPolicy = Policy
    .Handle()
    .Or()
    .CircuitBreakerAsync(
        exceptionsAllowedBeforeBreaking: 5,
        durationOfBreak: TimeSpan.FromSeconds(10),
        onBreak: (ex, breakDelay) => Console.WriteLine("熔断开启"),
        onReset: () => Console.WriteLine("熔断重置"),
        onHalfOpen: () => Console.WriteLine("半开探测")
    );

第4步:配置降级回退(Fallback)

目的:当所有重试和熔断策略均无法挽回时,返回默认值或缓存数据,保证用户体验不被完全阻断。

关键代码逻辑:

var fallBackPolicy = Policy
    .Handle()
    .Fallback("执行失败,返回Fallback默认值");

string result = fallBackPolicy.Execute(() => ThrowException());
Console.WriteLine(result); // 输出: 执行失败,返回Fallback默认值

手动实现重试模式的原理剖析

虽然Polly提供了便捷的功能,但理解其背后的状态管理逻辑对调试复杂问题至关重要。以下是简化的手动实现核心结构。

第1步:定义重试控制器状态

需要维护当前重试次数、最大重试次数以及执行结果的标识。

public class RetryPattern
{
    private uint MaxTryCount; // 最大重试次数
    private uint CurrentTryCount; // 当前已重试次数
    private bool RunResult = true; // 执行结果标志

    public void SetMaxCount(uint tryCount)
    {
        if (tryCount == 0) throw new ArgumentException("重试次数不能为0");
        MaxTryCount = tryCount;
    }
}

第2步:实现重试判断逻辑

根据当前次数是否达到上限,决定是否允许再次重试。

    public bool IsRetry()
    {
        // 如果之前执行成功,或已达到最大次数,则不再重试
        if (RunResult || CurrentTryCount == MaxTryCount)
            return false;
        else
        {
            RunResult = true; // 重置标志,防止重复进入
            return true;
        }
    }

    public void RetryHandle()
    {
        RunResult = false;
        CurrentTryCount++;
    }

总结

在C#应用中实施异常重试策略,推荐优先使用Polly库,它能灵活组合Retry、Bulkhead、CircuitBreaker等多种模式。对于简单场景或特定需求,手动实现状态机也是一种有效的补充手段。合理设置重试次数和退避时间,能有效提升系统的容错能力。

以上就是C#异常执行重试的详细实现方法,更多关于C#高级特性及Polly库的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。