Example #1
0
        /// <summary>
        /// 全てのリクエストを送信し、全てのレスポンスを受信します。
        /// </summary>
        /// <typeparam name="TRequest">リクエストの型</typeparam>
        /// <typeparam name="TResponse">レスポンスの型</typeparam>
        /// <typeparam name="TResult">実行結果の型</typeparam>
        /// <param name="call">呼び出しオブジェクト</param>
        /// <param name="requests">リクエストを取得する処理</param>
        /// <param name="converter">実行結果への変換処理</param>
        /// <returns>実行結果</returns>
        public static async Task <GrpcResult <IList <TResult> > > WriteReadAllAsync <TRequest, TResponse, TResult>(this AsyncDuplexStreamingCall <TRequest, TResponse> call, IEnumerable <AsyncFunc <TRequest> > requests, Converter <TResponse, TResult> converter)
            where TRequest : class where TResponse : class
        {
            Task <GrpcResult> send = WriteAllAsync(call, requests, true);
            Task <GrpcResult <IList <TResult> > > receive = ReadAllAsync <TRequest, TResponse, TResult>(call, converter);

            await Task.WhenAll(send, receive).ConfigureAwait(false);

            return(await receive);
        }
Example #2
0
        /// <summary>
        /// 全てのリクエストを送信し、全てのレスポンスに対して指定された処理を実行します。
        /// </summary>
        /// <typeparam name="TRequest">リクエストの型</typeparam>
        /// <typeparam name="TResponse">レスポンスの型</typeparam>
        /// <param name="call">呼び出しオブジェクト</param>
        /// <param name="requests">リクエストを取得する処理</param>
        /// <param name="action">実行する処理</param>
        /// <returns>実行結果</returns>
        public static async Task <GrpcResult> WriteAndForEachAsync <TRequest, TResponse>(this AsyncDuplexStreamingCall <TRequest, TResponse> call, AsyncFunc <IEnumerable <TRequest> > requests, AsyncAction <TResponse> action)
            where TRequest : class where TResponse : class
        {
            Task <GrpcResult> send    = WriteAllAsync(call, requests, true);
            Task <GrpcResult> receive = ForEachAsync(call, action);

            await Task.WhenAll(send, receive).ConfigureAwait(false);

            return(await receive);
        }
Example #3
0
        /// <summary>
        /// 全てのレスポンスを受信します。
        /// </summary>
        /// <typeparam name="TRequest">リクエストの型</typeparam>
        /// <typeparam name="TResponse">レスポンスの型</typeparam>
        /// <typeparam name="TResult">実行結果の型</typeparam>
        /// <param name="call">呼び出しオブジェクト</param>
        /// <param name="converter">実行結果への変換処理</param>
        /// <returns>実行結果</returns>
        public static async Task <GrpcResult <IList <TResult> > > ReadAllAsync <TRequest, TResponse, TResult>(this AsyncDuplexStreamingCall <TRequest, TResponse> call, Converter <TResponse, TResult> converter)
            where TRequest : class where TResponse : class
        {
            try
            {
                List <TResult> list = new List <TResult>();

                while (await call.ResponseStream.MoveNext().ConfigureAwait(false))
                {
                    list.Add(converter(call.ResponseStream.Current));
                }

                return(GrpcResult.Create <IList <TResult> >(list, call.ToInterface()));
            }
            catch (Exception ex) when(GrpcExceptionUtility.HasRpcException(ex))
            {
                return(HandleResponseListException <TRequest, TResponse, TResult>(call, ex));
            }
        }