Grpc CompleteAsync - PullRequest
       5

Grpc CompleteAsync

0 голосов
/ 28 июня 2018

У меня открыт дуплексный потоковый вызов на сервер, и я хочу отменить его от клиента до его завершения. Для этого я вызываю CompleteAsync () на моем IClientStreamWriter , и как только эта задача ожидается, я вызываю кнопку Отмена для токена отмены, переданного моему AsyncEnumerator.MoveNext. Что-то вроде ниже псевдокода. Что я нахожу это довольно часто, это приводит к RpcException в MoveNext со статусом Отменено. Однако, если я вставлю ожидающее ожидание Task.Delay (200) между CompleteAsync и clientCancelled.Cancel () , MoveNext завершится нормально. Таким образом, кажется, что сервер имеет время для обработки сообщений CompleteAsync и завершения вызова в обычном режиме.

Мой вопрос: какая здесь рекомендуемая практика? Безопасно ли просто вызывать CompleteAsync и не потрудиться использовать токен отмены? Если да, то когда я буду использовать токен отмены? Я могу представить себе сценарий, когда CompleteAsync выдает ошибку или сервер не сообщает клиенту, что больше нет сообщений. Без токена отмены мы могли бы получить утечку ресурсов.

var clientCancelled = new CancellationTokenSource();

    while (await responseStream.MoveNext(clientCancelled.Token))
    {
        var message = responseStream.Current;
        DoSomething(message); 
    }

Вызывается, когда клиент отменяет запрос

await requestStream.CompleteAsync().ConfigureAwait(false);
clientCancelled.Cancel()
...