C#异常Retry通用类

系统里面常常调用服务和读写文件里面需要对发生异常,操作失败时进行Retry来尽可能程序的健壮性。最近工作中遇到了,参考了网上的资料,扩展了下。在博客里面备用下:

//Retry机制
 public static class Retry
 {
 /// 
 /// 重试零个参数无返回值的方法
 /// 执行方法方法
 /// 重试间隔
 /// 重试次数
 public static void Execute(Action action, TimeSpan retryInterval, int retryCount = 3)
 {
 Execute<object>(() =>
 {
 action();
 return null;
 }, retryInterval, retryCount);
 }

 /// 
 /// 重试一个参数无返回值的方法
 /// 参数类型1
 /// 执行方法方法
 /// 参数1
 /// 重试间隔
 /// 重试次数
 public static void Execute(Action action, T1 arg1, TimeSpan retryInterval, int retryCount = 3)
 {
 Execute<T1, object>((x1) =>
 {
 action(arg1);
 return null;
 }, arg1, retryInterval, retryCount);
 }

 /// 
 /// 重试两个参数无返回值的方法
 /// 
 /// 参数类型1
 /// 参数类型2
 /// 执行方法方法
 /// 参数1
 /// 参数2
 /// 重试间隔
 /// 重试次数
 public static void Execute<T1, T2>(Action<T1, T2> action, T1 arg1, T2 arg2, TimeSpan retryInterval, int retryCount = 3)
 {
 Execute<T1, T2, object>((x1, x2) =>
 {
 action(arg1, arg2);
 return null;
 }, arg1, arg2, retryInterval, retryCount);
 }

 /// 
 /// 重试三个参数无返回值的方法
 /// /// 参数类型1
 /// 参数类型2
 /// 参数类型3
 /// 执行方法方法
 /// 参数1
 /// 参数2
 /// 参数3
 /// 重试间隔
 /// 重试次数
 public static void Execute<T1, T2, T3>(Action<T1, T2, T3> action, T1 arg1, T2 arg2, T3 arg3, TimeSpan retryInterval, int retryCount = 3)
 {
 Execute<T1, T2, T3, object>((x1, x2, x3) =>
 {
 action(arg1, arg2, arg3);
 return null;
 }, arg1, arg2, arg3, retryInterval, retryCount);
 }

 /// 
 /// 重试四个参数无返回值的方法
 /// /// 参数类型1
 /// 参数类型2
 /// 参数类型3
 /// 参数类型4
 /// 执行方法方法
 /// 参数1
 /// 参数2
 /// 参数3
 /// 参数4
 /// 重试间隔
 /// 重试次数
 public static void Execute<T1, T2, T3, T4>(Action<T1, T2, T3, T4> action, T1 arg1, T2 arg2, T3 arg3, T4 arg4, TimeSpan retryInterval, int retryCount = 3)
 {
 Execute<T1, T2, T3, T4, object>((x1, x2, x3, x4) =>
 {
 action(arg1, arg2, arg3, arg4);
 return null;
 }, arg1, arg2, arg3, arg4, retryInterval, retryCount);
 }

 /// 
 /// 重试零个参数带返回值
 /// /// 返回类型
 /// 执行的方法
 /// 重试间隔
 /// 重试次数
 /// 返回类型T
 public static T Execute(Func func, TimeSpan retryInterval, int retryCount = 3)
 {
 var exceptions = new List();

 for (int retry = 0; retry < retryCount; retry++)
 {
 try
 {
 return func();
 }
 catch (Exception ex)
 {
 exceptions.Add(ex);
 Thread.Sleep(retryInterval);
 }
 }

 throw new AggregateException(exceptions);
 }

 /// 
 /// 重试一个参数带返回值
 /// /// 参数类型1
 /// 返回类型
 /// 执行的方法
 /// 参数1
 /// 重试间隔
 /// 重试次数
 /// 返回类型T
 public static T Execute<T1, T>(Func<T1, T> func, T1 arg1, TimeSpan retryInterval, int retryCount = 3)
 {
 var exceptions = new List();

 for (int retry = 0; retry < retryCount; retry++)
 {
 try
 {
 return func(arg1);
 }
 catch (Exception ex)
 {
 exceptions.Add(ex);
 Thread.Sleep(retryInterval);
 }
 }

 throw new AggregateException(exceptions);
 }

 /// 
 /// 重试两个参数带返回值
 /// /// 参数类型1
 /// 参数类型2
 /// 返回类型
 /// 执行的方法
 /// 参数1
 /// 参数2
 /// 重试间隔
 /// 重试次数
 /// 返回类型T
 public static T Execute<T1, T2, T>(Func<T1, T2, T> func, T1 arg1, T2 arg2, TimeSpan retryInterval, int retryCount = 3)
 {
 var exceptions = new List();

 for (int retry = 0; retry < retryCount; retry++)
 {
 try
 {
 return func(arg1, arg2);
 }
 catch (Exception ex)
 {
 exceptions.Add(ex);
 Thread.Sleep(retryInterval);
 }
 }

 throw new AggregateException(exceptions);
 }

 /// 
 /// 重试三个参数带返回值
 /// /// 参数类型1
 /// 参数类型2
 /// 参数类型3
 /// 返回类型
 /// 执行的方法
 /// 参数1
 /// 参数2
 /// 参数3
 /// 重试间隔
 /// 重试次数
 /// 返回类型T
 public static T Execute<T1, T2, T3, T>(Func<T1, T2, T3, T> func, T1 arg1, T2 arg2, T3 arg3, TimeSpan retryInterval, int retryCount = 3)
 {
 var exceptions = new List();

 for (int retry = 0; retry < retryCount; retry++)
 {
 try
 {
 return func(arg1, arg2, arg3);
 }
 catch (Exception ex)
 {
 exceptions.Add(ex);
 Thread.Sleep(retryInterval);
 }
 }

 throw new AggregateException(exceptions);
 }

 /// 
 /// 重试四个参数带返回值
 /// /// 参数类型1
 /// 参数类型2
 /// 参数类型3
 /// 参数类型4
 /// 返回类型
 /// 执行的方法
 /// 参数1
 /// 参数2
 /// 参数3
 /// 参数4
 /// 重试间隔
 /// 重试次数
 /// 返回类型T
 public static T Execute<T1, T2, T3, T4, T>(Func<T1, T2, T3, T4, T> func, T1 arg1, T2 arg2, T3 arg3, T4 arg4, TimeSpan retryInterval, int retryCount = 3)
 {
 var exceptions = new List();

 for (int retry = 0; retry < retryCount; retry++)
 {
 try
 {
 return func(arg1, arg2, arg3, arg4);
 }
 catch (Exception ex)
 {
 exceptions.Add(ex);
 Thread.Sleep(retryInterval);
 }
 }

 throw new AggregateException(exceptions);
 }
 }

 

作者:张雪飞
出处:https://zhangxuefei.site/p/53
版权说明:欢迎转载,但必须注明出处,并在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

发表评论

电子邮件地址不会被公开。 必填项已用*标注