Пример #1
0
 public IValueContainer Decompose(object value)
 {
     return(new AwaiterContainer
     {
         Task = TaskAwaiterUtils.GetTask(value)
     });
 }
Пример #2
0
        public IObjectComposer SelectComposer(Type targetType)
        {
            if (TaskAwaiterUtils.IsAwaiterType(targetType))
            {
                return(_taskAwaiterSerializer);
            }

            if (typeof(Task).IsAssignableFrom(targetType))
            {
                return(_taskSerializer);
            }

            if (typeof(ServiceProxyContext).IsAssignableFrom(targetType))
            {
                return(_serviceProxySerializer);
            }

            if (typeof(CancellationTokenSource).IsAssignableFrom(targetType))
            {
                return(_cancellationTokenSourceSerializer);
            }

            if (targetType == typeof(CancellationToken))
            {
                return(_cancellationTokenSerializer);
            }

            return(null);
        }
Пример #3
0
        public IObjectDecomposer SelectDecomposer(Type valueType)
        {
            if (TaskAwaiterUtils.IsAwaiterType(valueType))
            {
                return(_taskAwaiterSerializer);
            }

            if (typeof(Task).IsAssignableFrom(valueType))
            {
                return(_taskSerializer);
            }

            if (typeof(CancellationTokenSource).IsAssignableFrom(valueType))
            {
                return(_cancellationTokenSourceSerializer);
            }

            if (valueType == typeof(CancellationToken))
            {
                return(_cancellationTokenSerializer);
            }

            if (typeof(IProxy).IsAssignableFrom(valueType))
            {
                return(_serviceProxySerializer);
            }

            return(null);
        }
        public IObjectComposer SelectComposer(Type targetType)
        {
            if (TaskAwaiterUtils.IsAwaiterType(targetType))
            {
                return(_taskAwaiterSerializer);
            }

            if (typeof(Task).IsAssignableFrom(targetType))
            {
                return(_taskSerializer);
            }

            if (typeof(ServiceProxyContext).IsAssignableFrom(targetType))
            {
                return(_serviceProxySerializer);
            }

            if (typeof(CancellationTokenSource).IsAssignableFrom(targetType))
            {
                return(_cancellationTokenSourceSerializer);
            }

            if (targetType.IsConstructedGenericType && targetType.GetGenericTypeDefinition() == typeof(TaskCompletionSource <>))
            {
                return(_taskCompletionSourceSerializer);
            }

            if (targetType == typeof(CancellationToken))
            {
                return(_cancellationTokenSerializer);
            }

            return(null);
        }
Пример #5
0
        public object Compose(IValueContainer container, Type valueType)
        {
            var values  = (AwaiterContainer)container;
            var awaiter = Activator.CreateInstance(valueType);

            TaskAwaiterUtils.SetTask(awaiter, values.Task);
            return(awaiter);
        }
Пример #6
0
        private bool TryFindDelayPromise(
            IAsyncStateMachine stateMachine,
            out Task delayPromise)
        {
#warning such analysis can be optimizer by pre-compiling the code per state machine type
            var metadata = _asyncStateMachineMetadataProvider.GetMetadata(stateMachine.GetType());

            foreach (var variable in metadata.LocalVariables)
            {
                if (TaskAwaiterUtils.IsAwaiterType(variable.FieldInfo.FieldType))
                {
                    var awaiter = variable.FieldInfo.GetValue(stateMachine);
                    var task    = TaskAwaiterUtils.GetTask(awaiter);
                    if (task != null && DelayPromiseAccessor.IsDelayPromise(task))
                    {
                        delayPromise = task;
                        return(true);
                    }
                }
            }

            delayPromise = null;
            return(false);
        }