srvr4vr Asked:2022-07-28 17:56:46 +0000 UTC2022-07-28 17:56:46 +0000 UTC 2022-07-28 17:56:46 +0000 UTC ASP.net Core gRPC - 超时停止请求处理 772 有一个通过 gRPC 通信的微服务,当代码循环时它有一个非常罕见的事件,目前还无法捕获它,但我想处理这种行为 - 我希望代码(流?)在超时时中断并且,为了响应请求,拍摄一些错误。有没有套路?Chet 没能用谷歌搜索——但我之前没有遇到过这样的问题。 c# 1 个回答 Voted Best Answer Vasek 2022-07-29T04:03:18Z2022-07-29T04:03:18Z 每个请求都有一个参数deadline和cancellationToken。通过它们可以进行超时。 try { var reply = await client.SayHelloAsync(new HelloRequest { Name = "GreeterClient" }, deadline: DateTime.UtcNow.AddSeconds(5)); Console.WriteLine("Greeting deadline: " + reply.Message); } catch (RpcException e) when (e.StatusCode == StatusCode.DeadlineExceeded) { // nop } try { var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5)); var reply = await client.SayHelloAsync(new HelloRequest { Name = "GreeterClient" }, cancellationToken: cts.Token); Console.WriteLine("Greeting cts: " + reply.Message); } catch (RpcException e) when (e.StatusCode == StatusCode.Cancelled) { // nop } 在服务器上,您还可以获得客户端发送的取消 public override async Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context) { try { await Task.Delay(20_000, context.CancellationToken); } catch (OperationCanceledException) { Console.WriteLine("cancel"); } return new HelloReply() { Message = "Hello " + request.Name }; }
每个请求都有一个参数
deadline
和cancellationToken
。通过它们可以进行超时。在服务器上,您还可以获得客户端发送的取消