void ResolveNext(ResolveCallState resolveCallState) { if (resolveCallState.StackedRetrievers.Count > 0) { MetadataRetriever retriever = resolveCallState.StackedRetrievers.Pop(); if (resolveCallState.HasBeenUsed(retriever)) { this.ResolveNext(resolveCallState); } else { if (resolveCallState.ResolvedMaxResolvedReferences) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.SFxResolvedMaxResolvedReferences))); } resolveCallState.LogUse(retriever); resolveCallState.HandleSection(retriever.Retrieve(resolveCallState.TimeoutHelper)); this.ResolveNext(resolveCallState); } } }
IAsyncResult BeginGetMetadata(MetadataRetriever retriever, AsyncCallback callback, object asyncState) { ResolveCallState state = new ResolveCallState(this.maximumResolvedReferences, this.resolveMetadataReferences, new TimeoutHelper(this.OperationTimeout), this); state.StackedRetrievers.Push(retriever); return new AsyncMetadataResolver(state, callback, asyncState); }
MetadataSet GetMetadata(MetadataRetriever retriever) { ResolveCallState resolveCallState = new ResolveCallState(this.maximumResolvedReferences, this.resolveMetadataReferences, new TimeoutHelper(this.OperationTimeout), this); resolveCallState.StackedRetrievers.Push(retriever); this.ResolveNext(resolveCallState); return resolveCallState.MetadataSet; }
internal AsyncMetadataResolver(ResolveCallState resolveCallState, AsyncCallback callerCallback, object callerAsyncState) : base(callerCallback, callerAsyncState) { if (resolveCallState == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("resolveCallState"); } this.resolveCallState = resolveCallState; Exception exception = null; bool doneResolving = false; try { doneResolving = this.ResolveNext(); } #pragma warning suppress 56500 // covered by FxCOP catch (Exception e) { if (Fx.IsFatal(e)) throw; exception = e; doneResolving = true; } if (doneResolving) { this.Complete(true, exception); } }