/// <summary> /// Gets a pipe response for the given pipe request. /// </summary> /// <param name="request">The request to send.</param> /// <param name="cancellationToken">A token to cancel the request.</param> /// <returns>The pipe response.</returns> private async Task <PipeResponse> GetResponseAsync(PipeRequest request, CancellationToken cancellationToken) { var pendingCall = new PendingCall(); this.pendingCalls.Add(request.CallId, pendingCall); await this.pipeStreamWrapper.SendRequestAsync(request, cancellationToken).ConfigureAwait(false); cancellationToken.Register( () => { pendingCall.TaskCompletionSource.TrySetException(new OperationCanceledException("Request has been canceled.")); }, false); return(await pendingCall.TaskCompletionSource.Task.ConfigureAwait(false)); }
/// <summary> /// Handles a response message received from a remote endpoint. /// </summary> /// <param name="response">The response message to handle.</param> public void HandleResponse(PipeResponse response) { PendingCall pendingCall = null; lock (this.pendingCallsLock) { if (this.pendingCalls.TryGetValue(response.CallId, out pendingCall)) { // Call has completed. Remove from pending list. this.pendingCalls.Remove(response.CallId); } else { throw new InvalidOperationException($"No pending call found for ID {response.CallId}"); } } // Mark method call task as completed. pendingCall.TaskCompletionSource.TrySetResult(response); }