c# - IAsyncInterceptor 陷入递归循环
问题描述
我正在遵循一种异步拦截简单方法的方法:https ://github.com/wswind/Learn-AOP/blob/master/AutofacAsyncInterceptor/CallLoggerAsyncInterceptor.cs
对于这个问题,此代码的简化版本可能是:
private async Task<TResult> InternalInterceptAsynchronous<TResult>(IInvocation invocation)
{
// do some async stuff
// invoke the original method
invocation.Proceed();
var task = (Task<TResult>)invocation.ReturnValue;
var result = await task;
return result;
}
在实现它之前,我确实认为它是递归的 - 因为invocation.Proceed()
然后会再次被拦截,它本身会调用Proceed()
再次,依此类推。
我已经看到了很多关于这个库的 SO 的建议,它被广泛接受为一种拦截异步的方法,我错过了什么会使这个方法不递归?它陷入了无限循环,但对我来说这是意料之中的。
编辑
我发现这是什么,将其缩小到“异步内容”,如下所示:
await MyAsyncMethod();
什么时候MyAsyncMethod
:
public async Task MyAsyncMethod()
{
// await somethingElse();
}
当我在等待一个自己等待的任务时,它会中断invocation.Proceed()
并且我被困在一个循环中。
非常感谢您对此的任何帮助!
解决方案
也可以试试https://fs7744.github.io/Norns.Urd/index.html
它使用简单的方式来支持异步
public class AddTenInterceptorAttribute : AbstractInterceptorAttribute
{
public override void Invoke(AspectContext context, AspectDelegate next)
{
next(context);
AddTen(context);
}
private static void AddTen(AspectContext context)
{
if (context.ReturnValue is int i)
{
context.ReturnValue = i + 10;
}
else if(context.ReturnValue is double d)
{
context.ReturnValue = d + 10.0;
}
}
public override async Task InvokeAsync(AspectContext context, AsyncAspectDelegate next)
{
await next(context);
AddTen(context);
}
}
[AddTenInterceptor]
public interface IGenericTest<T, R> : IDisposable
{
// or
//[AddTenInterceptor]
T GetT();
}
推荐阅读
- typescript - Typescript:为类型别名创建扩展方法
- python - 在循环中将值添加到行并在数据框中连接
- java - spring-data-jpa 多对多 findByID
- javascript - webpack/babel 转译删除对象键
- python - 问题 Virtualenv
- parallel-processing - MPI_Bcast() 之前的障碍?
- unity3d - 在 URP 中投射透明平面的阴影
- haskell - 在 Haskell 中生成更高维的列表
- javascript - 什么管理 create-react-app 中的 ECMAScript 版本?
- python-3.x - pandas 从列表中的元组中获取最大阈值