public static async ValueTask <Maybe <T> > TryReadSafeAsync <T>(this IReadableChannel <T> channel) { T result; while (!channel.TryReadSafe(out result)) { if (!await channel.WaitForNextSafeAsync().ConfigureAwait(false)) { return(Maybe <T> .Nothing); } } return(new Maybe <T>(result)); }
private static async Task GreetingDuplexStreaming( IReadableChannel <GreetingRequest> requestStream, IWriteOnlyChannel <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.WaitForNextSafeAsync().ConfigureAwait(false)) { while (requestStream.TryReadSafe(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"); }
private static async Task <GreetingResponse> GreetingClientStreaming( IReadableChannel <GreetingRequest> requeststream, MethodCallContext context) { Console.WriteLine("Received client streaming request from {{{0}}}", context); var names = new List <string>(); while (await requeststream.WaitForNextSafeAsync().ConfigureAwait(false)) { while (requeststream.TryReadSafe(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 }); }