Прослушивание изменений в Firestore Document через RPC API - PullRequest
0 голосов
/ 26 декабря 2018

В настоящее время я пытаюсь использовать 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.

1 Ответ

0 голосов
/ 27 декабря 2018

Хорошо, я нашел ошибку, которую сделал, может быть, это поможет будущим поколениям, я просто удалил следующую строку, чтобы она заработала:

    // 2. wait until listenRequest is sent
    await call.RequestStream.CompleteAsync();

Кажется, что в AsyncDuplexStreamingCall потоки не являются независимымидруг от друга (в отличие от двух двунаправленных потоков в , который я использовал в качестве основы ).По окончании RequestStream действие ResponseStream также прекратилось, поэтому я не смог наблюдать никаких изменений. Дуплекс в AsyncDuplexStreamingCall предполагает такое поведение.

...