如何正常停止读取gRPC流并在客户端C#上断开连接

时间:2019-09-20 10:07:36

标签: c# grpc

我有如下所示的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时,我需要客户端正常停止读取响应。 我该怎么做?

如果我只是停止阅读并关闭频道,服务器将其视为中止。

1 个答案:

答案 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

的更多信息