C # gRPC используя крайний срок вместо токена отмены - PullRequest
0 голосов
/ 05 ноября 2019

Я использую gRPC в C # и продолжаю комбинировать два 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 Ответ

1 голос
/ 11 ноября 2019

serverCallContext.CancellationToken будет отменен в следующих случаях: 1. вызов был отменен клиентом 2. достигнут крайний срок (который фактически отменяет вызов автоматически, так что это своего рода подслучатель 1.)3. произошла ошибка другого типа (например, проблема с сетью).

serverCallContext.Deadline существует только для «информативных» целей, нет необходимости отслеживать его самостоятельно, gRPC будет обрабатывать отслеживание крайнего срока для вас.

...