我正在使用Ninject Interceptor,以便在调用实际方法之前和之后执行某些任务,但我需要这些操作是异步的。我已经看了下面的文章making-ninject-interceptors-work-with-async-methods并实现了异步部分,但是现在我错过了最后一篇文章,那就是等待/非阻塞等待任务在Intercept方法中完成。
我不能使用wait,因为我希望这是异步非阻塞操作
/// <summary>
/// Intercepts the specified invocation.
/// </summary>
/// <param name="invocation">The invocation to intercept.</param>
public void Intercept(IInvocation invocation)
{
Task<bool> resultTask = InterceptAsync(invocation);
if (resultTask.Exception != null)
throw new Exception("Exception.", resultTask.Exception.InnerException);
}
/// <summary>
/// Intercepts the specified invocation.
/// </summary>
/// <param name="invocation">The invocation to intercept.</param>
protected async Task<bool> InterceptAsync(IMyInvocation invocation)
{
await BeforeInvokeAsync(invocation);
if (!invocation.Cancel)
{
invocation.Proceed();
await AfterInvokeAsync(invocation);
}
return true;
}
我甚至试图将async放在这个方法上,但我仍然遇到问题,可能是因为这是一个无效的方法
/// <summary>
/// Intercepts the specified invocation.
/// </summary>
/// <param name="invocation">The invocation to intercept.</param>
public async void Intercept(IInvocation invocation)
{
Task<bool> resultTask = InterceptAsync(invocation);
await resultTask;
if (resultTask.Exception != null)
throw new Exception("Exception.", resultTask.Exception.InnerException);
}
有没有办法让这个真正的异步一路方法?
答案 0 :(得分:2)
我被迫破解了这个问题,我在 Ninject.Extensions.Interception 中更改了一些代码,以允许 async / await 。
我刚刚开始测试代码,到目前为止,在 Proceed 被调用之前似乎等待正在运行。我并不是100%确定一切都按预期工作,因为我需要更多时间来玩这个,所以请随时查看实施情况,如果发现错误或有建议,请回复我。
https://github.com/khorvat/ninject.extensions.interception
重要 - 此解决方案仅适用于LinFu DynamicProxy,因为LinFu以可用于允许异步等待的方式生成代理类。
注意:此解决方案同样是“hack”,而不是完整的异步拦截实现。
此致