В настоящее время я пытаюсь использовать RPC API , предоставленный Google Firestore через приложение Unity через следующий фрагмент кода.Фрагмент основан на определениях протобуфера и официальном gRPC Tutorial , показывающем, как реализовать и использовать двунаправленные потоки:
public async void ListenTest()
{
// create cancellation token:
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken cancellationToken = source.Token;
using (AsyncDuplexStreamingCall<ListenRequest, ListenResponse> call = client.Listen())
{
// create listenRequest with corresponding properties:
var listenRequest = new ListenRequest();
listenRequest.Database = database;
listenRequest.AddTarget = new Target();
listenRequest.AddTarget.Documents = new Target.Types.DocumentsTarget
{
Documents = { database + "/documents/MyCollection/MyDocument" }
};
// task to handle response stream messages
var responseReaderTask = Task.Run(async () =>
{
while (await call.ResponseStream.MoveNext(cancellationToken))
{
ListenResponse loc = call.ResponseStream.Current;
Debug.Log("Received " + loc);
}
});
Debug.Log("Listening for " + database + "/documents/MyCollection/MyDocument");
// 1. asynchronously send listenRequest
await call.RequestStream.WriteAsync(listenRequest);
// 2. wait until listenRequest is sent
await call.RequestStream.CompleteAsync();
// 3. handle responses...
await responseReaderTask;
}
}
Выполнение этого немедленно прекращает responseReaderTask
, никакие изменения, внесенные в Firestore, не достигают приложения.
Что-то не так с этим кодом?Я прочитал все еще без ответа аналогичный вопрос , который объясняет ту же проблему для GoLang.Может быть та же проблема.
Получение одного документа с помощью client.GetDocument(getDocumentRequest)
works.