C#异常执行重试的实现方法
一 模式介绍
重试模式,是应用在异常处理中,发生异常的时候,能够对业务程序进行重新调用,在实际中,可以使用Polly提供稳定,简单的用法,自己实现主要是对模式的一种了解。
二 模式实现
public class RetryPattern{/*** 重试模式可以用Polly替代* 自己实现一种模式*/#region 构造函数public RetryPattern(){}#endregion 构造函数#region 变量private uint MaxTryCount; // 最大重试次数private uint CurrentTryCount; // 当前重试的次数private bool RunResult = true; // 执行结果#endregion 变量#region 方法#region 设置最大重试次数public void SetMaxCount(uint tryCount){// 校验if (tryCount == 0) throw new ArgumentException("重试次数不能为0"); MaxTryCount = tryCount; }#endregion 设置最大重试次数#region 是否需要重试public bool IsRetry(){if (RunResult || CurrentTryCount == MaxTryCount)return false; else{RunResult = true; return true; }}#endregion 是否需要重试#region 获取当前重试次数public uint GetCurrentTryCount(){return CurrentTryCount + 1; }#endregion 获取当前重试次数#region 重试public void RetryHandle(){RunResult = false; CurrentTryCount++; }#endregion 重试#endregion 方法}
ps:下面通过代码看下C# 异常重试策略
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Polly; using Polly.Bulkhead; using Polly.CircuitBreaker; using Polly.Fallback; using Polly.NoOp; using Polly.Registry; using Polly.Retry; using Polly.Timeout; using Polly.Utilities; using Polly.Wrap; using System.Net.Http; namespace CircuitBreak_Test{public partial class Form1 : Form{public Form1(){InitializeComponent(); }private void button1_Click(object sender, EventArgs e){try{var retryTwoTimesPolicy =Policy.Handle().Retry(3, (ex, count) =>{Console.WriteLine("执行失败! 重试次数 {0}", count); Console.WriteLine("异常来自 {0}", ex.GetType().Name); }); retryTwoTimesPolicy.Execute(() =>{Compute(); }); }catch (DivideByZeroException e1){Console.WriteLine($"Excuted Failed,Message: ({e1.Message})"); }Policy policy = Policy.Handle().WaitAndRetryAsync(5, retryAttempt => TimeSpan.FromSeconds(5), (exception, retryCount) =>{//logger.Error(exception); string xx = ""; }); var result = policy.ExecuteAsync(() => Test()); Policy _circuitBreakerPolicy = Policy.Handle().Or ().Or ().CircuitBreakerAsync(exceptionsAllowedBeforeBreaking: 5,durationOfBreak: new TimeSpan(),onBreak: (ex, breakDelay) =>{},onReset: () => { },onHalfOpen: () => { }); var fallBackPolicy =Policy.Handle ().Fallback("执行失败,返回Fallback"); var fallBack = fallBackPolicy.Execute(() =>{throw new Exception(); }); Console.WriteLine(fallBack); }static int Compute(){var a = 0; return 1 / a; }private static async Task Test(){using (HttpClient httpClient = new HttpClient()){var response = httpClient.GetAsync("http://news1.cnblogs.com/Category/GetCategoryList?bigCateId=11&loadType=0").Result; await response.Content.ReadAsStringAsync(); }}}}
【C#异常执行重试的实现方法】到此这篇关于C#异常执行重试的一种实现方法的文章就介绍到这了,更多相关C#异常重试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- CVE-2020-16898|CVE-2020-16898 TCP/IP远程代码执行漏洞
- 字符串拼接成段落,换行符(\n)如何只执行n-1次
- python-安装sublime遇到异常
- Android|Android BLE蓝牙连接异常处理
- R语言|R语言 函数
- C#中类的异常处理详解
- php异常处理
- 高效执行力第六课-小结
- 成功通航(用宜搭提升数字化管理效能,确保每次飞行任务安全执行)
- @逆战千锋|@逆战千锋 为什么sql语句执行之后表单中没有数据