我在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);
答案 0 :(得分:1)
在这些情况下,serverCallContext.CancellationToken将被取消: 1.呼叫被客户取消 2.截止日期已到(实际上会自动取消呼叫,因此是1的子情况。) 3.还有其他类型的错误(例如网络问题)。
serverCallContext.Deadline仅用于“信息性”目的,无需自己跟踪,gRPC会为您处理跟踪截止日期。