首页 > 解决方案 > 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()并且我被困在一个循环中。

非常感谢您对此的任何帮助!

标签: c#.netasync-awaitinterceptorcastle

解决方案


也可以试试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();
}

推荐阅读