У меня открыт дуплексный потоковый вызов на сервер, и я хочу отменить его от клиента до его завершения. Для этого я вызываю 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()