В случае получения потока в асинхронном клиенте gRP C вы будете использовать класс ClientAsyncReader<>
для получения данных. Этот класс отличается, когда и отправка, и получение являются потоковыми, но logi c одно и то же.
Этот класс имеет метод Finish()
, который необходимо вызвать после завершения отправки данных rp c на сервер. . Когда поток ответов с сервера закончится, будет добавлено сообщение на CompletionQueue
, соответствующее этому методу. Этот Finish
метод возвращает окончательный статус, когда его сообщение возвращается в CQ . Вы можете узнать, что ваш поток завершен. Ваш код будет похож на этот:
response_reader_ = stub->PrepareAsyncXYZ(ctx_, req, cq);
response_reader_->StartCall(&start_data_);
response_reader_->Finish(&status_, &finish_data_);
в этом примере сообщение в CQ будет иметь тег finish_data_
, и вы можете использовать его для правильной обработки. Вам, вероятно, потребуется управлять сообщениями для Finish()
и Read()
путем подсчета ссылок, потому что вы, вероятно, также получите дополнительное сообщение об ошибке чтения. когда сообщение с finish_data_
получено в CQ, status_
будет иметь действительное значение status.
По крайней мере, так я его написал.