예제 #1
0
        public bool TryRegisterNew(object taskCompletionSource, out TriggerReference triggerReference)
        {
            if (taskCompletionSource == null)
            {
                throw new ArgumentNullException(nameof(taskCompletionSource));
            }
            if (!TaskCompletionSourceAccessor.IsTaskCompletionSource(taskCompletionSource))
            {
                throw new ArgumentException($"Input object must be a TaskCompletionSource`1, but got {taskCompletionSource.GetType()}", nameof(taskCompletionSource));
            }

            var task = TaskCompletionSourceAccessor.GetTask(taskCompletionSource);

            triggerReference = task.AsyncState as TriggerReference;
            if (triggerReference != null)
            {
                return(false);
            }

            triggerReference = new TriggerReference
            {
                Id = _numericIdGenerator.NewId()
            };
            task.SetAsyncState(triggerReference);

            return(true);
        }
예제 #2
0
 public IValueContainer Decompose(object value)
 {
     return(new TaskCompletionSourceContainer
     {
         Task = TaskCompletionSourceAccessor.GetTask(value)
     });
 }
예제 #3
0
        public void AddTrigger(long id, Type valueType)
        {
            var taskCompletionSource = TaskCompletionSourceAccessor.Create(valueType);

            lock (_triggers)
            {
                _triggers.Add(id, taskCompletionSource);
            }
        }
예제 #4
0
        public void SubscribeToTrigger(long id, Action <TaskResult> action)
        {
            object taskCompletionSource;

            lock (_triggers)
            {
                taskCompletionSource = _triggers[id];
            }
            var task = TaskCompletionSourceAccessor.GetTask(taskCompletionSource);

            task.ContinueWith(t => action(t.ToTaskResult()));
        }
예제 #5
0
        public void ActivateTrigger(long id, TaskResult value)
        {
            object taskCompletionSource;

            lock (_triggers)
            {
                taskCompletionSource = _triggers[id];
            }
            var task = TaskCompletionSourceAccessor.GetTask(taskCompletionSource);

            task.TrySetResult(value);
        }
예제 #6
0
        public object Compose(IValueContainer container, Type valueType)
        {
            var values = (TaskCompletionSourceContainer)container;

            if (values.Task == null) // must not be NULL!
            {
                return(TaskCompletionSourceAccessor.Create(typeof(object)));
            }

            var taskCompletionSource = TaskCompletionSourceAccessor.Create(values.Task);

            _taskCompletionSourceRegistry.Monitor(taskCompletionSource);
            return(taskCompletionSource);
        }
예제 #7
0
        public bool Monitor(object taskCompletionSource)
        {
            if (taskCompletionSource == null)
            {
                throw new ArgumentNullException(nameof(taskCompletionSource));
            }
            if (!TaskCompletionSourceAccessor.IsTaskCompletionSource(taskCompletionSource))
            {
                throw new ArgumentException($"Input object must be a TaskCompletionSource`1, but got {taskCompletionSource.GetType()}", nameof(taskCompletionSource));
            }

            var task = TaskCompletionSourceAccessor.GetTask(taskCompletionSource);

            if (!(task.AsyncState is TriggerReference triggerReference))
            {
                return(false);
            }

#warning Check if already subscribed to the completion.
            task.ContinueWith(OnTaskComplete, TaskContinuationOptions.ExecuteSynchronously);

            return(true);
        }