c# - C#重试方法拦截与免费的AOP框架
问题描述
我对 C# 中的 AOP 完全陌生。目前,我有兴趣为使用此技术的方法编写重试。
所以,基于postsharp tut:https ://doc.postsharp.net/method-interception 我写了这段代码:
[Serializable]
public class RetryAspect : MethodInterceptionAspect
{
private int _sleep;
private int _retries;
private object _expectedResult;
private object _defaultReturnValue;
public RetryAspect(object expectedResult, int waitBetweenCycles, int numberOfRetries) : this(expectedResult, waitBetweenCycles, numberOfRetries, null) { }
public RetryAspect(object expectedResult, int waitBetweenCycles, int numberOfRetries, object defaultReturnValue)
{
_expectedResult = expectedResult;
_sleep = waitBetweenCycles;
_retries = numberOfRetries;
_defaultReturnValue = defaultReturnValue;
}
public override void OnInvoke(MethodInterceptionArgs args)
{
int waitCount = 0;
while (!args.ReturnValue.Equals(_expectedResult))
{
args.Proceed();
if (waitCount++ < _retries)
{
Thread.Sleep(_sleep);
}
else
{
if (_defaultReturnValue != null)
{
args.ReturnValue = _defaultReturnValue;
}
break;
}
}
}
}
class Program
{
static int cnt = 0;
static void Main(string[] args)
{
Console.WriteLine(Test());
Console.ReadKey();
}
[RetryAspect(true, 1000, 5)]
public static bool Test()
{
Console.WriteLine("Test {0}", cnt);
if (cnt == 4)
{
return true;
}
else
{
cnt++;
return false;
}
}
}
现在,有没有办法通过使用免费/开源 AOP 框架来实现相同的结果?到目前为止,我没有找到任何具有不同 AOP 框架的有用示例。
解决方案
虽然它不是 AOP 我可以建议你使用Polly:
Polly 是一个 .NET 弹性和瞬态故障处理库,它允许开发人员表达策略,例如重试......
您只需要使用其流畅的 API 定义您的策略:
var policy = Policy
.HandleResult<bool>(false)
//Or using one of WaitAndRetry overloads if you want to sleep between retries
.Retry(5);
并执行它:
policy.Execute(() => Test());
推荐阅读
- reactjs - 反应查询 useQuery,GraphQL + fetch。如何传递变量?
- rust - 如何共享 TlsStream
在经纱请求中 - linux - io_uring 中的最大注册缓冲区大小
- python - CSV:如何从行创建列表并从包含列表的列表中查找列表的最接近值?
- javascript - 尝试通过定位父类名将标题添加到链接(来自小部件)的属性
- a-star - 用于 2x2 魔方求解的 A* 算法中的 h(n) 选择
- python - 使用 lambda 获取 s3 对象时出错:ClientError:调用 GetObject 操作时发生错误(AccessDenied):访问被拒绝
- string - Helm 将字符串转换为管道以在 IF 检查中有效
- javascript - 如何使用 HTML 或 JS 在 PC 或 Mac 上更改浏览器选项卡颜色
- flutter - dart 说“不可为空的变量必须在使用前初始化”,即使在使用 if 分配之后,else 块