【问题标题】:How do you make gRPC client Timeout in C# if the server is down?如果服务器关闭,如何在 C# 中使 gRPC 客户端超时?
【发布时间】:2016-10-06 19:14:40
【问题描述】:

我正在使用 gRPC 从 MS Windows 10 上的 C# 平台写回 TensorFlow Serving 系统的连接。我已经看到很多关于使用用于 gRPC 的 C++ API 的 Time-out 和 Dead-line 的引用,但似乎看不到弄清楚如何在 C# 下超时。

我只是打开一个到服务器的通道,设置一个客户端和对服务器的调用。我希望这个 Classify 在 5 秒左右后超时。任何帮助或指导将不胜感激。

channel = new Channel(modelServer, ChannelCredentials.Insecure);

var client = MyService.NewClient(channel);

MyResponse classvalue = client.Classify(featureSet);

【问题讨论】:

    标签: c# grpc


    【解决方案1】:

    要设置通话的截止日期,您只需使用以下“截止日期”:

    client.Classify(featureSet, deadline: DateTime.UtcNow.AddSeconds(5));
    

    client.Classify(featureSet, new CallOptions(deadline: DateTime.UtcNow.AddSeconds(5)));
    

    代码完成应该很容易发现这两种方式。

    【讨论】:

    • 谢谢,我的开发平台没有外部库的代码完成功能。只需稍作修改即可:
    • client.Classify(featureSet, 截止日期:DateTime.UtcNow.AddSeconds(5));从 UtcNow 之后删除 ()
    • 这个答案似乎已经过时了,当前版本中没有Classify
    • 分类只是一个例子。所以把它读作 myGrpcClient.MyCall(someParam, deadline: DateTime.UtcNow.AddSeconds(5));
    • 一次超时。会抛出异常(RpcException)吗?
    【解决方案2】:

    在调用连接通道时需要使用 GRPC 超时来检测服务器宕机情况。我是这样做的:

        private async void SampleCode()
         {
              var client = await GetClient();
              var data = await client.GetAllTemplatesAsync(request, new 
                    CallOptions().WithDeadline(DateTime.UtcNow.AddSeconds(7)));
    
         }
    
        private async Task<MyGrpcClient> GetClient()
        {
            var channel = new Channel("somehost",23456, ChannelCredentials.Insecure);
            await channel.ConnectAsync(deadline: DateTime.UtcNow.AddSeconds(2));
            return new MyGrpcClient(channel);
        }
    

    因此,如果服务器关闭,对 GetClient() 的调用将超时。如果服务器已启动但响应时间过长,则客户端服务调用的超时将生效。

    【讨论】:

      猜你喜欢
      • 2020-04-03
      • 1970-01-01
      • 2017-02-11
      • 2015-12-06
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多