如何为带参数的方法实现通用重试模式?
通用重试模式的简洁实现(支持任意参数)
你当前的实现通过重载Execute方法适配不同参数数量的委托,确实会带来维护痛点:新增参数数量的方法就需要加对应重载,修改重试逻辑时要同步更新所有重载。
可以通过闭包封装的方式,用单一方法实现支持任意参数的通用重试逻辑,核心思路是把所有带参数的方法调用包装成无参的Func<TResult>,让核心重试逻辑只需要处理这一种委托类型。
简化后的通用Retrier实现
using System; using System.Threading; public class Retrier { /// <summary> /// 执行指定方法,失败时自动重试指定次数,每次重试间隔指定毫秒数 /// </summary> /// <typeparam name="TResult">方法返回值类型</typeparam> /// <param name="function">要执行的无参委托(可通过Lambda包装带参数方法)</param> /// <param name="tryTimes">总尝试次数</param> /// <param name="interval">重试间隔(单位:毫秒)</param> /// <returns>方法执行成功后的返回值</returns> /// <exception cref="ArgumentNullException">当function为null时抛出</exception> /// <exception cref="ArgumentOutOfRangeException">当tryTimes小于1时抛出</exception> public static TResult Execute<TResult>(Func<TResult> function, int tryTimes, int interval) { if (function == null) throw new ArgumentNullException(nameof(function)); if (tryTimes < 1) throw new ArgumentOutOfRangeException(nameof(tryTimes), "尝试次数不能小于1"); for (int i = 0; i < tryTimes - 1; i++) { try { return function(); } catch { Thread.Sleep(interval); } } // 最后一次尝试,失败直接抛出异常(不捕获) return function(); } }
调用示例(支持任意参数数量)
不管目标方法有多少个参数,都可以通过Lambda表达式将其封装成无参委托:
1. 无参方法调用
// 调用无参的GetData方法,重试3次,间隔1秒 var data = Retrier.Execute(() => GetData(), 3, 1000);
2. 单参数方法调用
int userId = 123; // 调用带userId参数的GetUserById方法 var user = Retrier.Execute(() => GetUserById(userId), 3, 1000);
3. 多参数方法调用
string userName = "Alice"; int userAge = 30; // 调用带两个参数的GetUserInfo方法 var userInfo = Retrier.Execute(() => GetUserInfo(userName, userAge), 3, 1000);
优势说明
- 维护成本极低:仅需维护一个核心重试方法,修改逻辑时只需调整这一处代码
- 适配任意参数:通过Lambda闭包封装,支持参数数量任意的方法
- 代码更简洁:避免了大量重复的重载代码,逻辑更集中
内容的提问来源于stack exchange,提问作者SeReGa
相关产品推荐
相关产品推荐

