下面是实现Castle Dynamic Proxy库的Intercept
自定义类型的方法中的代码。此片段来自一个基于AOP的日志记录概念验证控制台应用程序,该应用程序发布在此处。IInterceptor
public void Intercept(IInvocation invocation)
{
if (Log.IsDebugEnabled) Log.Debug(CreateInvocationLogString("Called", invocation));
try
{
invocation.Proceed();
if (Log.IsDebugEnabled)
if (invocation.Method.ReturnType != typeof(void))
Log.Debug("Returning with: " + invocation.ReturnValue);
}
catch (Exception ex)
{
if (Log.IsErrorEnabled) Log.Error(CreateInvocationLogString("ERROR", invocation), ex);
throw;
}
}
这在常规方法调用上按预期工作,但在尝试使用async
方法时(使用async/await
C# 5.0 中的关键字)则不行。我相信,我也理解这背后的原因。
为了async/await
工作,编译器将方法的功能体添加到幕后的状态机中,一旦awaitable
遇到第一个无法同步完成的表达式,控制就会返回给调用者。
此外,我们可以询问返回类型并确定我们是否正在处理async
这样的方法:
if (invocation.Method.ReturnType == typeof(Task) ||
(invocation.Method.ReturnType.IsGenericType &&
invocation.Method.ReturnType.GetGenericTypeDefinition() == typeof(Task<>)))
Log.Info("Asynchronous method found...");
这仅适用于那些async
返回Task
或Task<>
不返回的方法,void
但我对此很好。
必须在Intercept
方法中进行哪些更改awaiter
才能返回到那里而不是原始调用者?