public async Task WaitMessage() { CancellationToken token = _cts.Token; while (true) { var tcs = new TaskCompletionSource <SabberResponse>(); _tcs = tcs; Console.WriteLine("Client " + Name + " is waiting a message."); try { await tcs.Task; } catch (OperationCanceledException) { Console.WriteLine($"Client {Name} is disconnected."); break; } if (tcs.Task.IsCanceled) { Console.WriteLine($"Client {Name} is disconnected."); break; } Console.WriteLine("Waiting ends."); SabberResponse response = tcs.Task.Result; Console.WriteLine($"Client {Name} gets a response {response.Message}."); #pragma warning disable CS4014 _responseStream.WriteAsync(response); #pragma warning restore CS4014 Console.WriteLine("Message \"" + response.Message + "\" is sent to " + Name); } }
static async Task ConnectAsync(string target, string clientName) { var channel = new Channel(target, ChannelCredentials.Insecure); await channel.ConnectAsync(); Console.WriteLine(clientName + " Connected."); var client = new Greeter.GreeterClient(channel); using (var server = client.Bidirectional( headers: new Metadata { new Metadata.Entry("name", clientName) })) { var responseReaderTask = Task.Run(async() => { while (await server.ResponseStream.MoveNext(CancellationToken.None)) { SabberResponse response = server.ResponseStream.Current; Console.WriteLine("Response received: " + response.Message);; } }); await server.RequestStream.WriteAsync(new SabberRequest { Type = SabberRequest.Types.Type.Test1 }); await server.RequestStream.CompleteAsync(); await responseReaderTask; Console.WriteLine("Client " + clientName + " is disconnected."); } }