我目前正尝试通过以下代码段通过Unity应用程序使用Google Firestore提供的RPC API。该代码段基于Protobuffer Definitions和官方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中所做的任何更改都不会到达应用程序。
此代码是否有问题?我读了尚未解答的similar question,它为GoLang解释了同样的问题。可能是同一个问题。
通过client.GetDocument(getDocumentRequest)
检索单个文档有效。
答案 0 :(得分:0)
好吧,我发现了我所犯的错误,也许这对子孙后代很有帮助,我只是删除了以下行使其起作用:
// 2. wait until listenRequest is sent
await call.RequestStream.CompleteAsync();
在AsyncDuplexStreamingCall
中,似乎流不是彼此独立的(不同于the example I used as a basis中的两个双向流)。 RequestStream
完成后,ResponseStream
也终止了,所以我看不到任何变化。 AsyncDuplexStreamingCall
中的 Duplex 暗示了这种行为。