Пример #1
0
        /// <summary>
        /// Called when [next].
        /// </summary>
        /// <param name="value">The value.</param>
        public void OnNext(EmbedlyRequest value)
        {
            Interlocked.Increment(ref _count);

            Log.DebugFormat("Http request for {0} urls: {1}", value.UrlRequests.Count, value.EmbedlyUrl);
            HttpSocket.GetAsync(value.EmbedlyUrl.AbsoluteUri,
                                _timeout,
                                callbackState =>
            {
                var state = (EmbedlyRequest)callbackState.State;
                if (callbackState.Exception == null)
                {
                    Response[] responses = Deserialize(callbackState.ResponseStream);
                    for (int i = 0; i < state.UrlRequests.Count; i++)
                    {
                        Log.DebugFormat("Response for url: {0} was {1} from {2}", state.UrlRequests[i].Url, responses[i].Type, state.UrlRequests[i].Provider.Name);
                        _cache.Put(state.UrlRequests[i], responses[i]);
                        _results.OnNext(new Result(state.UrlRequests[i], responses[i]));
                    }
                }
                else
                {
                    foreach (UrlRequest urlRequest in state.UrlRequests)
                    {
                        _results.OnNext(new Result(urlRequest, callbackState.Exception));
                    }
                }

                // signal when we're done so consumers can finish
                if (Interlocked.Decrement(ref _count) == 0 && _complete)
                {
                    _results.OnCompleted();
                }
            },
                                value);
        }