Example #1
0
            public void OnNextResult(
                ForwardingConsumer consumer,
                T closeableObject,
                bool isFinal)
            {
                IEnumerator <KeyValuePair <Tuple <IConsumer <T>, IProducerContext>, object> > iterator;

                lock (_gate)
                {
                    // Check for late callbacks
                    if (_forwardingConsumer != consumer)
                    {
                        return;
                    }

                    CloseSafely(_lastIntermediateResult);
                    _lastIntermediateResult = default(T);

                    iterator = _consumerContextPairs.GetEnumerator();
                    while (iterator.MoveNext())
                    {
                        iterator.Current.Key.Item1.OnNewResult(closeableObject, isFinal);
                    }

                    if (!isFinal)
                    {
                        _lastIntermediateResult = _parent.CloneOrNull(closeableObject);
                    }
                    else
                    {
                        _consumerContextPairs.Clear();
                        _parent.RemoveMultiplexer(_key, this);
                    }
                }
            }
Example #2
0
            public void OnCancelled(ForwardingConsumer forwardingConsumer)
            {
                lock (_gate)
                {
                    // Check for late callbacks
                    if (_forwardingConsumer != forwardingConsumer)
                    {
                        return;
                    }

                    _forwardingConsumer       = null;
                    _multiplexProducerContext = null;
                    CloseSafely(_lastIntermediateResult);
                    _lastIntermediateResult = default(T);
                }

                StartInputProducerIfHasAttachedConsumers();
            }
Example #3
0
            /// <summary>
            /// Starts next producer if it is not started yet and there is
            /// at least one Consumer waiting for the data. If all consumers
            /// are cancelled, then this multiplexer is removed from _request
            /// map to clean up.
            /// </summary>
            internal void StartInputProducerIfHasAttachedConsumers()
            {
                BaseProducerContext multiplexProducerContext;
                ForwardingConsumer  forwardingConsumer;

                lock (_gate)
                {
                    Preconditions.CheckArgument(_multiplexProducerContext == null);
                    Preconditions.CheckArgument(_forwardingConsumer == null);

                    // Cleanup if all consumers have been cancelled before
                    // this method was called
                    if (_consumerContextPairs.IsEmpty)
                    {
                        _parent.RemoveMultiplexer(_key, this);
                        return;
                    }

                    var iterator = _consumerContextPairs.GetEnumerator();
                    iterator.MoveNext();
                    IProducerContext producerContext = iterator.Current.Key.Item2;
                    _multiplexProducerContext = new BaseProducerContext(
                        producerContext.ImageRequest,
                        producerContext.Id,
                        producerContext.Listener,
                        producerContext.CallerContext,
                        producerContext.LowestPermittedRequestLevel,
                        ComputeIsPrefetch(),
                        ComputeIsIntermediateResultExpected(),
                        ComputePriority());

                    _forwardingConsumer      = new ForwardingConsumer(this);
                    multiplexProducerContext = _multiplexProducerContext;
                    forwardingConsumer       = _forwardingConsumer;
                }

                _inputProducer.ProduceResults(
                    forwardingConsumer,
                    multiplexProducerContext);
            }
Example #4
0
            public void OnProgressUpdate(ForwardingConsumer forwardingConsumer, float progress)
            {
                IEnumerator <KeyValuePair <Tuple <IConsumer <T>, IProducerContext>, object> > iterator;

                lock (_gate)
                {
                    // Check for late callbacks
                    if (_forwardingConsumer != forwardingConsumer)
                    {
                        return;
                    }

                    _lastProgress = progress;
                    iterator      = _consumerContextPairs.GetEnumerator();
                }

                while (iterator.MoveNext())
                {
                    lock (iterator)
                    {
                        iterator.Current.Key.Item1.OnProgressUpdate(progress);
                    }
                }
            }
Example #5
0
            public void OnFailure(ForwardingConsumer consumer, Exception t)
            {
                IEnumerator <KeyValuePair <Tuple <IConsumer <T>, IProducerContext>, object> > iterator;

                lock (_gate)
                {
                    // Check for late callbacks
                    if (_forwardingConsumer != consumer)
                    {
                        return;
                    }

                    iterator = _consumerContextPairs.GetEnumerator();
                    while (iterator.MoveNext())
                    {
                        iterator.Current.Key.Item1.OnFailure(t);
                    }

                    _consumerContextPairs.Clear();
                    _parent.RemoveMultiplexer(_key, this);
                    CloseSafely(_lastIntermediateResult);
                    _lastIntermediateResult = default(T);
                }
            }