Пример #1
0
        /// <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));
        }
Пример #2
0
        /// <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);
        }