我們基本上有一個如下所示的類,它使用Castle.DynamicProxy進行攔截。是否可以使用Castle.DynamicProxy創建異步inteceptor?
using System;
using System.Collections.Concurrent;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using Castle.DynamicProxy;
namespace SaaS.Core.IoC
{
public abstract class AsyncInterceptor : IInterceptor
{
private readonly ILog _logger;
private readonly ConcurrentDictionary<Type, Func<Task, IInvocation, Task>> wrapperCreators =
new ConcurrentDictionary<Type, Func<Task, IInvocation, Task>>();
protected AsyncInterceptor(ILog logger)
{
_logger = logger;
}
void IInterceptor.Intercept(IInvocation invocation)
{
if (!typeof(Task).IsAssignableFrom(invocation.Method.ReturnType))
{
InterceptSync(invocation);
return;
}
try
{
CheckCurrentSyncronizationContext();
var method = invocation.Method;
if ((method != null) && typeof(Task).IsAssignableFrom(method.ReturnType))
{
var taskWrapper = GetWrapperCreator(method.ReturnType);
Task.Factory.StartNew(
async() => { await InterceptAsync(invocation, taskWrapper).ConfigureAwait(true); }
, // this will use current synchronization context
CancellationToken.None,
TaskCreationOptions.AttachedToParent,
TaskScheduler.FromCurrentSynchronizationContext()).Wait();
}
}
catch (Exception ex)
{
//this is not really burring the exception
//excepiton is going back in the invocation.ReturnValue which
//is a Task that failed. with the same excpetion
//as ex.
}
}
....
最初,這個代碼是:
Task.Run(async() => { await InterceptAsync(invocation, taskWrapper)).Wait()
但是,我們這個任意調用後失去的HttpContext,所以我們不得不將其切換到:
Task.Factory.StartNew
因此,我們可以通過在TaskScheduler.FromCurrentSynchronizationContext()
所有這些都不好,因爲我們真的只是s爲另一個線程轉移一個線程。我真的很喜歡的
void IInterceptor.Intercept(IInvocation invocation)
簽名更改爲
async Task IInterceptor.Intercept(IInvocation invocation)
,擺脫了Task.Run或Task.Factory的,只是使它:
await InterceptAsync(invocation, taskWrapper);
問題是Castle.DynamicProxy IInterecptor不會允許這個。我真的很想在攔截中等待。我可以做.Result,但那麼我打電話的異步呼叫有什麼意義?如果不能夠做到這一點,我就會失去它能夠產生這個線程執行的好處。我沒有卡住Castle Windsor的DynamicProxy,所以我正在尋找另一種方法來做到這一點。我們研究過Unity,但我不想替換我們的整個AutoFac實現。
任何幫助,將不勝感激。
感謝您的鏈接我會檢查出來,我會給你的例子。我一直在尋找這個問題的答案。 –