我有如下所示的gRPC服务定义
service ConsumerService
{
stream Message Consume(SubscriptionRequest);
}
客户端如下所示:
var consumer = new ConsumerService.ConsumerServiceClient(<channel>);
AsyncServerStreamingCall<Message> proxy = consumer.ConsumeAsync(subRequest));
while (!gracefulShutdown)
await proxy.ResponseStream.MoveNext(cts.Token);
// todo: tell the server that client is not going to read responses anymore..
await proxy.ResponseStream.CompleteAsync(); // I would like to have method like this
当gracefulShutdown设置为true时,我需要客户端正常停止读取响应。 我该怎么做?
如果我只是停止阅读并关闭频道,服务器将其视为中止。
答案 0 :(得分:0)
就我在互联网上检查过的东西而言,我没有找到任何优雅的方法。我希望使用CancellationTokenSource。只需尝试,赶上。看起来这是预期的行为。 grpc小组的评论
取消将用于强制终止 因突发情况而导致的未接来电,您不应依赖 它们用于处理应用程序中的基本工作流程
像这里一样使用catch块检查异常
catch (RpcException e) when (e.Status.StatusCode == StatusCode.Cancelled)
{
Console.WriteLine("Streaming was cancelled from the client!");
}
有关github C# Clean Cancellation
的更多信息