public static async Task ConsumeAsync <T>(
            this IReadableChannel <T> channel,
            Func <T, Task> handleAsync,
            CancellationToken cancellationToken      = default,
            Func <Task> onCompletedAsync             = null,
            Func <Exception, Task> onTerminatedAsync = null)
        {
            try
            {
                do
                {
                    while (channel.TryRead(out var item))
                    {
                        await handleAsync(item).ConfigureAwait(false);
                    }
                } while (await channel.WaitReadAvailableAsync(cancellationToken).ConfigureAwait(false));

                if (onCompletedAsync != null)
                {
                    await onCompletedAsync().ConfigureAwait(false);
                }
            }
            catch (Exception ex)
            {
                if (onTerminatedAsync != null)
                {
                    await onTerminatedAsync(ex).ConfigureAwait(false);
                }
                else
                {
                    throw;
                }
            }
        }
示例#2
0
        public async Task DuplexStreaming(IReadableChannel <GreetingRequest> requestStream, IWritableChannel <GreetingResponse> responseStream, MethodCallContext context)
        {
            Console.WriteLine("Received duplex streaming request from {{{0}}}", context);
            var greeting = "Hello!";
            await responseStream.WriteAsync(new GreetingResponse { Greeting = greeting }).ConfigureAwait(false);

            Console.WriteLine("Sent: {0}", greeting);
            while (await requestStream.WaitReadAvailableAsync().ConfigureAwait(false))
            {
                while (requestStream.TryRead(out var request))
                {
                    Console.WriteLine("Received: {0}", request.Name);
                    greeting = $"Hello, {request.Name}!";
                    await responseStream
                    .WriteAsync(new GreetingResponse { Greeting = greeting })
                    .ConfigureAwait(false);

                    Console.WriteLine("Sent: {0}", greeting);
                }
            }
            Console.WriteLine("Request stream completed");
            greeting = "Good Bye!";
            await responseStream
            .WriteAsync(new GreetingResponse { Greeting = greeting })
            .ConfigureAwait(false);

            Console.WriteLine("Sent: {0}", greeting);
            greeting = "See you again!";
            await responseStream
            .WriteAsync(new GreetingResponse { Greeting = greeting })
            .ConfigureAwait(false);

            Console.WriteLine("Sent: {0}", greeting);
            Console.WriteLine("Completed");
        }
 public static async ValueTask <Maybe <T> > TryReadAsync <T>(this IReadableChannel <T> channel, CancellationToken cancellationToken = default)
 {
     do
     {
         if (channel.TryRead(out var item))
         {
             return(item);
         }
     } while (await channel.WaitReadAvailableAsync(cancellationToken).ConfigureAwait(false));
     return(Maybe <T> .Nothing);
 }
示例#4
0
        public async Task <GreetingResponse> ClientStreaming(IReadableChannel <GreetingRequest> requestStream, MethodCallContext context)
        {
            Console.WriteLine("Received client streaming request from {{{0}}}", context);
            var names = new List <string>();

            while (await requestStream.WaitReadAvailableAsync().ConfigureAwait(false))
            {
                while (requestStream.TryRead(out var request))
                {
                    Console.WriteLine("Received: {0}", request.Name);
                    names.Add(request.Name);
                }
            }
            Console.WriteLine("Request stream completed");
            var greeting = $"Hello, {string.Join(", ", names)}!";

            Console.WriteLine("Sending response: {0}", greeting);
            return(new GreetingResponse {
                Greeting = greeting
            });
        }