Beispiel #1
0
 public void ValueAdded(INode <SmartValue> node, SmartValue value)
 {
     if (Interlocked.Increment(ref _count) == _expected)
     {
         _source.SetCompleted();
     }
 }
Beispiel #2
0
 public void ValueRemoved(INode <T> node, T value)
 {
     if (Interlocked.Increment(ref _count) == _expected)
     {
         _source.SetCompleted();
     }
 }
Beispiel #3
0
        Task IFilter <T> .Send(T context, IPipe <T> next)
        {
            _latest = context;
            _hasValue.SetCompleted();

            return(next.Send(context));
        }
Beispiel #4
0
            Task IRetryObserver.PostFault <T>(RetryContext <T> context)
            {
                Interlocked.Increment(ref _postFaultCount);

                _postFault.SetCompleted();

                return(TaskUtil.Completed);
            }
Beispiel #5
0
 /// <summary>
 /// Puts the agent in a ready state, explicitly
 /// </summary>
 public virtual void SetReady()
 {
     _ready.SetCompleted();
 }
Beispiel #6
0
        /// <summary>
        /// Stops the agent
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        protected virtual Task StopAgent(StopContext context)
        {
            _completed.SetCompleted();

            return(TaskUtil.Completed);
        }
Beispiel #7
0
        /// <summary>
        /// Set the agent Completed for duty
        /// </summary>
        /// <param name="completedTask"></param>
        protected void SetCompleted(Task completedTask)
        {
            lock (_completed)
            {
                if (_setCompleted != null)
                {
                    // if a previous completedTask is already completed, no sense in trying
                    if (_setCompleted.Task.IsCompleted)
                    {
                        return;
                    }

                    _setCompletedCancel.Cancel();

                    _setCompleted       = null;
                    _setCompletedCancel = null;
                }

                if (_completed.Task.IsCompleted)
                {
                    return;
                }

                var setCompletedCancel = _setCompletedCancel = new CancellationTokenSource();

                void OnSetCompleted(Task <bool> task)
                {
                    if (setCompletedCancel.IsCancellationRequested)
                    {
                        return;
                    }

                    if (task.IsCanceled)
                    {
                        _completed.TrySetCanceled();
                    }
                    else if (task.IsFaulted)
                    {
                        // ReSharper disable once AssignNullToNotNullAttribute
                        _completed.TrySetException(task.Exception);
                    }
                    else
                    {
                        _completed.TrySetResult(task.Result);
                    }
                }

                TaskCompletionSource <bool> setCompleted = _setCompleted = TaskUtil.GetTask();
                setCompleted.Task.ContinueWith(OnSetCompleted, TaskScheduler.Default);

                void OnCompleted(Task task)
                {
                    if (setCompletedCancel.IsCancellationRequested)
                    {
                        return;
                    }

                    if (task.IsCanceled)
                    {
                        setCompleted.TrySetCanceled();
                    }
                    else if (task.IsFaulted)
                    {
                        // ReSharper disable once AssignNullToNotNullAttribute
                        setCompleted.TrySetException(task.Exception);
                    }
                    else
                    {
                        setCompleted.SetCompleted();
                    }
                }

                completedTask.ContinueWith(OnCompleted, TaskScheduler.Default);
            }
        }