实际的软件开发中,我们经常会遇到需要处理连接失败、网络超时或其他临时性问题的情况。为了增加代码的健壮性和可靠性,我们可以使用重试机制来自动重新尝试操作,直到成功或达到最大重试次数。
在.net 中有一个NutGet包库:Policy。这是一个功能比较强大的重试机制库。贼牛。
搜索NuGet 包管理器安装 Polly
库
他有好多重试策略针对不同的类型,如:文件上传:、Sql操作、Http操作等等等的重试、熔断、超时、回退等策略。
// 创建一个策略,用于处理异常并进行重试
Policy policy = Policy.Handle()
.Retry(3, (exception, retryCount) =>
{
Console.WriteLine($"由于{exception.Message}. 正在重试操作。重新尝试 {retryCount}");
});
// 执行操作,并获取策略的执行结果
PolicyResult policyResult = policy.Execute(() =>
{
// 执行操作
return SomeOperation();
});
// 根据策略的执行结果进行相应的处理
if (policyResult.Outcome == OutcomeType.Successful)
{
Console.WriteLine("操作成功");
}
else if (policyResult.Outcome == OutcomeType.Failure)
{
Console.WriteLine("操作失败");
}
// 创建一个上下文对象,用于传递和共享数据
Context context = new Context("myKey", "myValue");
// 创建一个策略,处理异常并进行重试,并在重试时使用上下文数据
Policy policy = Policy.Handle()
.Retry(3, (exception, retryCount, context) =>
{
Console.WriteLine($"正在使用键{context[“myKey”]}重试操作。重试尝试{retryCount}");
});
// 使用上下文执行操作
policy.Execute(context, () =>
{
// 执行操作
return SomeOperation();
});
// 创建一个重试策略,指定重试次数和重试间隔
RetryPolicy policy = Policy.Handle()
.WaitAndRetry(new[]
{
TimeSpan.FromSeconds(1),
TimeSpan.FromSeconds(2),
TimeSpan.FromSeconds(3)
});
// 执行操作,并进行重试
policy.Execute(() =>
{
// 执行操作
return SomeOperation();
});
// 创建一个熔断器策略,指定失败次数和熔断时间
CircuitBreakerPolicy policy = Policy.Handle()
.CircuitBreaker(3, TimeSpan.FromSeconds(10),
(exception, duration) =>
{
Console.WriteLine($"断路器由于{exception.Message}而断开。将在{duration.TotalSeconds}秒后重试");
},
() =>
{
Console.WriteLine("断路器复位");
});
// 执行操作,并进行熔断处理
policy.Execute(() =>
{
// 执行操作
return SomeOperation();
});
// 创建一个回退策略,指定备用逻辑
FallbackPolicy policy = Policy.Handle()
.Fallback(() =>
{
// 执行备用逻辑
return "回退值";
});
// 执行操作,并在失败时执行备用逻辑
string result = policy.Execute(() =>
{
// 执行操作
return SomeOperation();
});
在使用Policy的时候,我们如果使用的是Policy.HandleException
类的异常然后进行重试等操作。
我们也可以让他捕获特定种类的异常然后重试:如TimeoutException异常或者HttpRequestException
也可以同时设置多个异常 我举个例子啊:
// 这个代码意思是捕获HttpRequestException异常和TaskCanceledException异常
// 发生异常后会进行3次重试,每次重试等待时间会逐渐增加以指数方式增长(2 的指数幂
// waitAndRetryAsync这个里面的方法是我抄的,很多方法大家可以百度一下。方法太多我也只会用最基本的
var policy = Policy.Handle()
.Or()
.WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
希望这篇文章对大家有帮助!我也只是记录一下自己的笔记。方便随时查看复用。