private T Create <T>(T concrete, ICancellableDispatcher dispatcher) where T : class { var interceptors = new IInterceptor[] { new DispatcherInterceptor <T>(dispatcher) }; var options = GetProxyGenerationOptions(dispatcher); return(_Generator.CreateInterfaceProxyWithTarget <T>(concrete, options, interceptors)); }
private static object DynamicDispatch(MethodInfo genericMethodInfo, ICancellableDispatcher dispatcher, IInvocation invocation, object context = null) { var solvedTask = invocation.Method.ReturnType.GetTaskType(); var methodInfo = genericMethodInfo.MakeGenericMethod(solvedTask.Type); return(methodInfo.Invoke(context, new object[] { dispatcher, invocation })); }
private ProxyGenerationOptions GetProxyGenerationOptions(ICancellableDispatcher dispatcher) { var options = new ProxyGenerationOptions(); if (!(dispatcher is IFiber fiber)) { return(options); } options.AddMixinInstance(new FiberProvider(fiber)); return(options); }
public DispatcherManager(ICancellableDispatcher dispatcher) { _Dispatcher = dispatcher; }
private static object DynamicEnqueue(ICancellableDispatcher dispatcher, IInvocation invocation) => DynamicDispatch(_Proceed, dispatcher, invocation);
private static object Proceed <TResult>(ICancellableDispatcher dispatcher, IInvocation invocation) => dispatcher.Enqueue(invocation.Call <Task <TResult> >);
private static object Enqueue(ICancellableDispatcher dispatcher, IInvocation invocation) => dispatcher.Enqueue(invocation.Call <Task>);
private static object Enqueue(ICancellableDispatcher dispatcher, IInvocation invocation, int cancellationTokenPosition) { var cancellationToken = (CancellationToken)invocation.Arguments[cancellationTokenPosition]; return(dispatcher.Enqueue(invocation.Call <Task>, cancellationToken)); }
private static object Dispatch(ICancellableDispatcher dispatcher, IInvocation invocation) { dispatcher.Dispatch(invocation.Call); return(null); }
internal object DynamicProceedWithCancellation(ICancellableDispatcher dispatcher, IInvocation invocation) => DynamicDispatch(_ProceedForCancellation, dispatcher, invocation, this);
internal object ProceedWithCancellation <TResult>(ICancellableDispatcher dispatcher, IInvocation invocation) { var cancellationToken = (CancellationToken)invocation.Arguments[_Index]; return(dispatcher.Enqueue(invocation.Call <Task <TResult> >, cancellationToken)); }
public DispatcherInterceptor(ICancellableDispatcher dispatcher) { _Dispatcher = dispatcher; }
public TaskEnqueueWithCancellationTester(ICancellableDispatcher cancellableDispatcher) { _CancellableDispatcher = cancellableDispatcher; }
internal DispatcherInterceptor(ICancellableDispatcher dispatcher) { _Dispatcher = dispatcher; }