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; } } }
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); }
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 }); }