/// <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); }