//模式4:针对 服务端 为 客户端+服务端 流示:创建基于同一个channel的客户端 Welcomer public static async void TestClientServerStream(GrpcChannel GprcChannel) { var client = new Welcomer.WelcomerClient(GprcChannel); using var call = client.SayHelloBiStream(); Console.WriteLine("Starting background task to receive messages"); var readTask = Task.Run(async() => { //开启一个后台接收线程 await foreach (var response in call.ResponseStream.ReadAllAsync()) { Console.WriteLine("ClientServerStream receive:" + response.Message); } }); for (var i = 0; i < 3; i++) { //发送多个客户端请求 await call.RequestStream.WriteAsync(new HelloRequestW { Name = "SayHelloClientServerStream " }); } //开始发送“我客户端已经发送完毕” await call.RequestStream.CompleteAsync(); await readTask; //等待后台接收线程完毕 }
//模式3:针对服务端为客户端流示:创建基于同一个channel的客户端 Welcomer public static async void TestClientStream(GrpcChannel GprcChannel) { var client = new Welcomer.WelcomerClient(GprcChannel); using var call = client.SayHelloClientStream(); for (var i = 0; i < 3; i++) { //发送多个客户端请求 await call.RequestStream.WriteAsync(new HelloRequestW { Name = "SayHelloClientStream" }); } //通知服务端“我客户端已经发送完毕” await call.RequestStream.CompleteAsync(); var response = await call; Console.WriteLine($"SayHelloClientStream Response: {response.Message}"); }
//模式2:针对服务端为一元调用示例 以及 针对服务端为服务端流示, 创建一个基于channel的客户端Greeter public static async void TestServerStreamClient(GrpcChannel GprcChannel) { //针对服务端为一元调用示例 var client2 = new Welcomer.WelcomerClient(GprcChannel); var reply2 = await client2.SayHelloAsync(new HelloRequestW { Name = "SayHelloAsync " }); Console.WriteLine("SayHelloAsync: " + reply2.Message); //针对服务端为服务端流示 var call = client2.SayHelloServerStream(new HelloRequestW { Name = "ServerStreamRequest " }); while (await call.ResponseStream.MoveNext()) { //直到服务端对应SayHelloServerStream方法调用完毕,MoveNext才会结束。 Console.WriteLine("SayHelloServerStream: " + call.ResponseStream.Current.Message); } }