private void PerformAsyncUow(IInvocation invocation, bool isTransactional) { var uow = _unitOfWorkManager.StartNew(isTransactional); invocation.Proceed(); Task result; if (invocation.Method.ReturnType == typeof(Task)) { result = AsyncHelper.ReturnTaskAfterAction( (Task)invocation.ReturnValue, async() => { await uow.CompleteAsync(); uow.Dispose(); } ); } else { result = (Task)AsyncHelper.CallReturnAfterAction( invocation.Method.ReturnType.GenericTypeArguments[0], invocation.ReturnValue, async() => { await uow.CompleteAsync(); uow.Dispose(); _iocResolver.Release(uow); } ); } invocation.ReturnValue = result; }