C#gRPC使用截止日期而不是取消令牌

时间:2019-11-05 20:19:25

标签: c# grpc

我在C#中使用gRPC,并且不断组合两个CancellationToken并将其传递给gRPC服务器:1是我的“全局”取消令牌(例如,如果用户单击“取消”按钮,则为示例),并且第二个是处理我的超时。我看到gRPC也有一个deadline选项,可以为每个调用提供。我想知道是否仍然可以在服务器上简单地使用CancellationToken?到达期限后会取消吗?还是我应该将其与服务器上调用的每个方法中的最后期限变量组合?

这可以让我做:

await client.MethodAsync( parametersHere, 
    cancellationToken: GlobalCancellationToken, 
    deadline: DateTime.Now.AddMinutes(2) );

与合并两个CancellationToken相比,它的书写和读取要容易得多:

using var cancelIn5Minutes = new CancellationTokenSource(TimeSpan.FromMinutes(5));
using var cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(stoppingToken, cancelIn5Minutes.Token);
await client.MethodAsync( parametersHere, 
    cancellationToken: cancellationTokenSource);

1 个答案:

答案 0 :(得分:1)

在这些情况下,serverCallContext.CancellationToken将被取消: 1.呼叫被客户取消 2.截止日期已到(实际上会自动取消呼叫,因此是1的子情况。) 3.还有其他类型的错误(例如网络问题)。

serverCallContext.Deadline仅用于“信息性”目的,无需自己跟踪,gRPC会为您处理跟踪截止日期。