protected async void SaveEmployees() { Response5 = string.Empty; //清空前台显示 using var channel = GrpcChannel.ForAddress(ServerAdderss); var client = new EmployeeService.EmployeeServiceClient(channel); var serverStreamingCall = client.SaveEmployees(); //因为是双向流的方式,我们需要同时操作“请求流”和“响应流” var requestStream = serverStreamingCall.RequestStream; var responseStream = serverStreamingCall.ResponseStream; //获取员工数据 var employees = GetNewEmployees(Request5.Trim()); //依次将员工数据写入请求流中 foreach (var employee in employees) { await requestStream.WriteAsync(new EmployeeRequest { Employee = employee }); } //告知服务端数据传递完毕 await requestStream.CompleteAsync(); //读取服务端返回的流式数据 await Task.Run(async() => { while (await responseStream.MoveNext(new CancellationToken())) { Response5 += $"New Employee “{responseStream.Current.Employee.Name}” is Saved" + Environment.NewLine; } }); }